C++中重载和覆盖的区别
来源:互联网 发布:c语言中分号的作用 编辑:程序博客网 时间:2024/04/30 02:52
一. 重载(overload)
1. 重载指的是函数具有的不同的参数列表,而函数名相同的函数。重载要求参数列表必须不同,比如参数的类型不同、参数的个数不同、参数的顺序不同。
2. 如果仅仅是函数的返回值不同是没办法重载的,因为重载要求参数列表必须不同。
3. 程序是根据参数列表来确定具体要调用哪个函数的
4. 看下面几个例子
void Fun(int a);
void Fun(double a);
void Fun(int a, int b);
void Fun(double a, int b);
上面四个函数都可以构成函数重载
int Fun(int a)
void Fun(int a)
//上面两个是无法构成函数重载的,参数列表必须不同
二. 覆盖(重写override)
1. 覆盖是存在类中,子类重写从基类继承过来的函数。但是函数名、返回值、参数列表都必须和基类相同。
2. 当子类的对象调用成员函数的时候,如果成员函数有被覆盖则调用子类中覆盖的版本,否则调用从基类继承过来的函数
3. 如果子类覆盖的是基类的虚函数,可以用来实现多态。
当子类重新定义基类的虚函数之后,基类指针可以根据赋给它不同子类指针动态的调用子类中的虚函数,可以做到动态绑定,这就是多态。
4. 子类覆盖基类函数的特征
(1)函数名相同、参数相同、返回值相同
(2)如果基类函数是虚函数,子类覆盖虚函数可以实现多态
三. 重载和覆盖的区别
1. 重载要求函数名相同,但是参数列表必须不同,返回值可以相同也可以不同。
覆盖要求函数名、参数列表、返回值必须相同。
2. 在类中重载是同一个类中不同成员函数之间的关系
在类中覆盖则是子类和基类之间不同成员函数之间的关系
3. 重载函数的调用是根据参数列表来决定调用哪一个函数
覆盖函数的调用是根据对象类型的不同决定调用哪一个
4. 在类中对成员函数重载是不能够实现多态
在子类中对基类虚函数的覆盖可以实现多态
看下面这个例子
#include<iostream>#include<algorithm>using namespace std;//基类class Base{public://基类Fun为重载函数void Fun(int x){ cout<<"Base::Fun(int x)"<<endl;}void Fun(double x){ cout<<"Base::Fun(double x)"<<endl;}//基类虚函数virtual void G(void){ cout<<"Base::G(void)"<<endl;}};//子类class SubClass:public Base{public://隐藏基类的Fun函数void Fun(int x){ cout<<"SubClass::Fun(int x)"<<endl;}void Fun(double x){ cout<<"SubClass::Fun(double x)"<<endl;}//覆盖基类虚函数virtual void G(void){ cout<<"SubClass::G(void)"<<endl;}};int main(){Base *base = new Base();SubClass *subClass = new SubClass();base = subClass; //基类指针指向子类对象//测试函数调用base->Fun(5); base->Fun(5.00);base->G();return 0;}
输出结果
分析:
1. 定义一个基类Base,基类内部有两个重载函数Fun和一个虚函数G
2. 子类SubClass继承了基类Base,子类首先隐藏了基类的两个函数Fun并且覆盖了基类虚函数G;
如果基类函数是虚函数,那么子类重新定义就属于覆盖。
如果基类函数不是虚函数,那么子类重新定义属于隐藏基类函数
3. main函数内部,基类指针base指向子类对象指针subClass,然后调用三个函数
(1)base->Fun(5) 输出“Base::Fun(int x)”说明调用的是基类的函数,可以看出通过基类指针并不能动态的调用子类覆盖基类的非虚函数
(2)base->Fun(5.00) 和上面类似
(3)base->G() 输出"SubClass::G(void)" 说明调用的是子类的函数G,可以看出通过基类指针可以动态的调用子类覆盖基类的虚函数
由此可见,多态的实现是通过子类覆盖基类的虚函数,利用基类指针指向不同的子类对象,在运行的时候动态的决定要调用哪个子类虚函数。
- Java中重载和覆盖的区别
- C++中重载和覆盖的区别
- java中重载和覆盖的区别
- C++中重载和覆盖的区别
- 覆盖和重载的区别
- 重载和覆盖的区别?
- 覆盖和重载的区别
- 重载和覆盖的区别
- 重载和覆盖的区别
- 重载和覆盖的区别
- C++_重载、重写(覆盖)和隐藏的区别:
- java中重载和覆盖(又称重写)的区别
- C++中覆盖、重载和隐藏的区别
- C++中覆盖、重载和隐藏的区别
- c++中重载、覆盖和隐藏概念的区别
- C++中重载、重写(覆盖)和隐藏的区别
- C++中函数重载、隐藏、覆盖和重写的区别
- C++中重载、重写(覆盖)和隐藏的区别
- ASP CMS 比较
- 异常
- 字符串转化
- 梁洛施公开严管三子虎招
- 关于WEB站点的安全
- C++中重载和覆盖的区别
- 姚博文 LVS
- Java获得泛型类型
- 从图库选择图片经验总结
- go语言:Eclipse与LiteIDE之间路径问题
- Follow谷大哥-使用Android studio + gradle
- 给你的shell一点颜色看看
- IOS沙盒
- 交换机vlan导致的打印机共享问题