c++ 中重载 覆盖 隐藏
来源:互联网 发布:c语言如何编写手机程序 编辑:程序博客网 时间:2024/04/30 11:53
一.重载
1.重载的定义:如果同一个作用域内的几个函数名字相同参数列表不同,称之为重载。
1).重载作用在静态链接时
重载发生在编译阶段。成员函数无论是否是虚函数都能重载。
2).在同一个作用域(如一个类的内部)
如果作用域不一样会发生什么呢?
此时,局部作用域(相对来讲)与外部作用域(相对来讲),出现了变量(包括变量和函数)名字一样,则外部作用域定义的函数被隐藏。如:一个函数在父类中定义,此时子类中声明了一个相同函数名的函数,(子类的作用域包含于父类)则没有发生重载,而是隐藏。
3).函数名称相同,返回值也相同,参数列表不同。
1.仅仅返回值不同的不是是重载,编译器会报错。
2.参数带const情况
参数是顶层const:void Lookup(int a)
void Lookup(const int a)编译器会忽略顶层const,故这两个在编译器看来是同一个函数,无法完成重载。
指针类型(换成引用也一样):
void Lookup(int*a)
void Lookup( int*const a )编译器会忽略顶层const,故这两个在编译器看来是同一个函数,无法完成重载。
参数是低层const:
指针类型(换成引用也一样):
void Lookup(int*a)
void Lookup( constint*a )可以完成重载
3.省略了参数名字或仅仅参数名不同
如:void Lookup(int a)
void Lookup(int b)
void Lookup(int )发生二义性问题,不能完成重载。编译器在看着三个函数一样。*只有在函数声明时,参数可省略,定义时不可以。
4.缺省参数
如:void Lookup(int a,int b=0)
void Lookup(int a)发生二义性问题,不能完成重载
注意:main函数不可以重载。
二.隐藏
在类中,指的是派生类的成员函数隐藏了基类函数的成员函数.隐藏一词可以这么理解:在调用一个类的成员函数的时候,编译器会沿着类的继承链逐级的向上查找函数的定义,如果找到了那么就停止查找了,所以如果一个派生类和一个基类都有同一个同名(暂且不论参数是否相同)的函数,而编译器最终选择了在派生类中的函数,那么我们就说这个派生类的成员函数"隐藏"了基类的成员函数,也就是说它阻止了编译器继续向上查找函数的定义。
三.覆盖(重写)
覆盖发生类的继承中,子类继承父类的虚成员函数,对其重写,实现动态绑定,用于运行时多态。
1.覆盖的参数列表,函数名,返回值必须相同。
2.函数在子类中,必须是虚函数,即有virtual关键字。
3.覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者其子类;
4.被覆盖的方法不能是private,因为子类没有访问父类private的权限。
四.重载与覆盖区别
1.覆盖发生在发生再父类到子类的继承过程,作用域不同,垂直关系。重载在同一个作用域,平行关系。
2.重载发生在编译时,覆盖发生在运行时。
3.重载要求函数名称相同,参数列表必须不相同,返回值类型相同。
覆盖的参数列表,函数名,返回值必须相同。
4.重载函数通过识别参数列表,匹配调用。覆盖函数,通过对象的不同来调用。
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- 【C++】重载、覆盖、隐藏
- c++: 重载 覆盖 隐藏
- c++(重载、覆盖、隐藏)
- Android数据库操作--greenDAO的入门使用
- [从头学绘画] 第32节 跆拳道二十四品势之3-岛山
- 如何判断一个链表是否有环?
- gem5跑Android bench
- 郁金香
- c++ 中重载 覆盖 隐藏
- jvm加载过程分析
- matlab simulink S-Function m文件的写法
- Ubuntu12.04安装sun-java6-jdk
- Spring回顾学习
- 简单扫雷游戏的实现
- ^异或运算。求解成对出现的一个未成对的数。
- 获取ListView滚动精确值
- QNX下ssh服务安装指南