C++重载重写和多态区别

1.重载和重写的区别:

重载overload:在同一个类中,函数名相同,参数列表不同,编译器会根据这些函数的不同参数列表,将同名的函数名称做修饰,从而生成一些不同名称的预处理函数,未体现多态。

重写override:也叫覆盖,子类重新定义父类中有相同名称相同参数的虚函数,主要是在继承关系中出现的,被重写的函数必须是virtual的,重写函数的访问修饰符可以不同,尽管virtual是private的,子类中重写函数改为public,protected也可以,体现了多态。

重定义redefining:也叫隐藏,子类重新定义父类中有相同名称的非虚函数,参数列表可以相同可以不同,会覆盖其父类的方法,未体现多态。

a如果派生类的函数和基类的函数同名,但是参数不同,此时,不管有无virtual,基类的函数被隐藏。

b如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有vitual关键字,此时,基类的函数被隐藏。(如果有virtual就成重写了)

[cpp] view plain copy

  1. #include <iostream>
  2. using namespace std;
  3. class Base
  4. {
  5. private:
  6. virtual void display() { cout<<"Base display()"<<endl; }
  7. void show(){ cout<<"Base show()"<<endl; }
  8. public:
  9. void exec(){ display(); show(); }
  10. void fun(string s) { cout<<"Base fun(string)"<<endl; }
  11. void fun(int a) { cout<<"Base fun(int)"<<endl; }//overload:两个fun函数在Base类的内部被重载
  12. virtual int function(){}
  13. };
  14. class ClassA:public Base
  15. {
  16. public:
  17. void display() { cout<<"ClassA display()"<<endl; }//override:基类中display为虚函数,且参数列表一直,故此处为重写
  18. void fun(int a,int b) { cout<<"ClassA fun(int,int)"<<endl; }//redefining:fun函数在Base类中不为虚函数,故此处为重定义
  19. void show() { cout<<"ClassA show()"<<endl; }//redefining:理由同上
  20. int function(int a){}//overload:注意这是重载而不是重写,因为参数列表不同,在编译时ClassA中其实还有个编译器自己偷偷加上的从Base继承来的int function(){};
  21. };
  22. int main(){
  23. ClassA a;
  24. Base *base=&a;
  25. base->exec();//display()是ClassA的,因为覆盖了,show()是Base自己的
  26. a.exec();//结果同上
  27. a.show();//show()是ClassA重定义的
  28. base->fun(1);//fun()是Base自己的,因为直接从对象base调用
  29. a.fun(1, 1);//fun()是ClassA重定义的
  30. return 0;
  31. }

执行结果:

2.多态性

“一个接口,多种方法”,程序在运行时才决定调用的函数,C++的多态性是通过虚函数来实现的。最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。如果没有使用虚函数的话,即没有利用C++多态性,则利用基类指针调用相应的函数的时候,将总被限制在基类函数本身,而无法调用到子类中被重写过的函数。因为没有多态性,函数调用的地址将是一定的,而固定的地址将始终调用到同一个函数,这就无法实现一个接口,多种方法的目的了。

a编译时多态性:通过重载函数实现 。
 b运行时多态性:通过虚函数实现。

时间: 2024-10-06 07:44:44

C++重载重写和多态区别的相关文章

重载,继承,重写和多态的区别

重载,继承,重写和多态的区别 重载,继承,重写和多态的区别: 1)继承是子类获得父类的成员, 2)重写是继承后重新实现父类的方法. 3)重载是在一个类里一系列参数不同名字相同的方法. 4)多态则是为了避免在父类里大量重载引起代码臃肿且难于维护. 网上看到一个有趣的说法是:继承是子类使用父类的方法,而多态则是父类使用子类的方法. 下面的例子包含了这四种实现: class Triangle extends Shape { public int getSides() {  return 3; }} c

重写、覆盖、重载、多态区别

override->重写(=覆盖).overload->重载.polymorphism -> 多态 override是重写(覆盖)了一个方法,以实现不同的功能.一般是用于子类在继承父类时,重写(重新实现)父类中的方法.重写(覆盖)的规则:   1.重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载.   2.重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private).   3.重写的方

C++基础6 【继承】 类型兼容 satatic 多继承 虚继承 【多态】 案例 虚析构函数 重载重写重定义

[继承] 继承的访问控制域 图 类型兼容性原则  指针 与 引用 用子类直接初始化父类 类的继承模型示意 图 [继承结论] [非常重要的概念] 继承与组合混搭情况下,构造和析构调用原则 原则:先构造父类,再构造成员变量.最后构造自己 先析构自己,在析构成员变量.最后析构父类 继承中,同名的成员变量的处理办法 继承中,同名的成员函数的处理办法 派生类中的static关键字 如果静态成员变量,你没有使用,也没有初始化的话 编译不会报错 经典错误 : 类中函数默认是private的,无法在外部访问 具

重载-重写(覆盖)-隐藏的区别

重载和重写搞的差不多了,隐藏有有点混乱了,在此记一下,留作后看 成员函数被重载的特征(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.重写(覆盖)是指派生类函数覆盖基类函数,--这是c++多态的标志,虚函数赋零则变成虚基类(纯粹的接口申明类),特征是(1)不同的范围(分别位于派生类与基类):(2)函数名字相同:(3)参数相同:(4)基类函数必须有virtual 关键字.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下(1)如果派

面向对象重写(override)与重载(overload)区别

一.重写(override) override是重写(覆盖)了一个方法,以实现不同的功能.一般是用于子类在继承父类时,重写(重新实现)父类中的方法. 重写(覆盖)的规则: 1.重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载. 2.重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private). 3.重写的方法的返回值必须和被重写的方法的返回一致: 4.重写的方法所抛出的异常必须和被重写方法的所抛出的异常

面向对象重写(override)与重载(overload)区别---转载“竹木人”

一.重写(override) override是重写(覆盖)了一个方法,以实现不同的功能.一般是用于子类在继承父类时,重写(重新实现)父类中的方法. 重写(覆盖)的规则: 1.重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载. 2.重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private). 3.重写的方法的返回值必须和被重写的方法的返回一致: 4.重写的方法所抛出的异常必须和被重写方法的所抛出的异常

重载,重写,多态例子

重载 方法重载是让类以统一的方式处理不同类型数据的一种手段.Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义.调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法. package com.wzs; /** * 重载 * * @author Administrator * */ public class OverLoadTest { public int add(int a, int b) { return a + b; } pub

方法的重载与重写有什么区别?

Java中函数重载与函数重写 方法重载(overloading method) .方法重载是让类以统一的方式处理不同类型数据的一种手段.Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不 同的定义.调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法, 这就是多态性.下面是一个方法重载的例子: Java代码 class MethodOverloading { void receive(int i) { System.out.println("

重载与覆盖的区别

对于在同一个可访问区内被声明的几个具有不同参数列(参数的类型.个数.顺序不同)的同名函数,程序会根据不同的参数列表来确定具体调用哪个函数,这种机制叫重载(overload),overlaod不关心函数的返回值. 覆盖(override)是指派生类中存在重新定义的函数,其函数名.参数列.返回值类型必须同父类的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体(花括号中的部分)不同,当派生类对象调用子类中同名函数时,会自动调用子类中的覆盖版本,而不是父类中的被覆盖版本. 成员函数被重载(ov