c++的重载、覆盖和遮蔽(隐藏)

来源:互联网 发布:深孔钻编程视频教程 编辑:程序博客网 时间:2024/05/17 07:02

C++的重载、覆盖和遮蔽(隐藏)

为了说明这三者的区别,引入函数签名的概念

函数签名主要包括1、函数名;2、参数的个数、数据类型和顺序

但是注意,函数签名不包括返回值

1、重载

在同一个类中,或者在顶层函数(与main函数同层)中,如果
(1)函数名相同
(2)函数签名不同
则就是函数重载。函数重载对函数返回值无要求,即返回值可以相同也可以不相同。
例如:函数int function(int, char)、int function(char, int)、int function(int)、int function(char)这四个函数相互之间构成了函数重载。
注意,函数重载返回值可以相同,也可以不相同!
例如:函数int function(int, char)、char function(int)构成函数重载
函数重载要求函数签名必须不同,下面的例子不是函数重载,这两个函数函数签名相同,会被认作是同一个函数,但是返回值又不相同,这样子的话编译器会报错:无法重载仅按返回类型区分的函数。
例如:函数int function(int, char)、char(int, char) 这不算是函数重载

2、覆盖

函数覆盖发生在继承层次之中。覆盖需要满足的条件如下:
(1)发生覆盖的函数必须分别在父类和子类中
(2)子类函数与父类函数的函数签名相同
(3)父类函数必须是虚函数
覆盖对函数返回值同样没有要求,可以相同,也可以不同,但是很少有编译器支持这种特性(VS2010就不支持这种特性,亲测)
class A
{
……
virtual int function(int, char){……}
……
};

class B::public A
{
……
virtual int function(int, char){……}
……

};

int main()
{
   A * one;
   B two;
   one = & two;
   one.function(int, char);
   return 0;
}

上面的例子就是一个覆盖,如果上面没有关键字virtual,那么调用的将会是class A 的函数
函数覆盖说的就是多态。

3、遮蔽(隐藏)

遮蔽是指子类中具有与父类同名的函数(不管参数列表是否相同),除去函数覆盖的情况。
遮蔽的条件:
(1)子类的成员函数与父类的成员函数名必须相同
(2)子类的虚函数无法覆盖父类的虚函数
遮蔽可以这么理解:
(1)子类成员函数与父类成员函数具有相同的函数名
(2)除去覆盖的情况
遮蔽要求函数名一定相同,函数签名可以相同也可以不相同。
也就是说,继承层次中,父类与子类同名函数要么是覆盖,要么是遮蔽。
上例中如果没有virtual关键字,就属于遮蔽情况。或者上例中,子类function函数与父类函数函数签名不同,则也是遮蔽情况。

总结:
(1)函数重载发生在同一个类或顶层函数中,同名的函数具有不同的参数列表
(2)函数覆盖发生在继承层次中,该函数在父类中必须是virtual,而子类的该函数必须与父类具有相同的参数列表
(3)函数遮蔽(隐藏)发生在继承层次中,父类和子类同名的函数中,不属于函数覆盖的都属于函数遮蔽




1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电信合约机丢了怎么办 s8合约机坏了怎么办 合约机的卡掉了怎么办 移动合约机屏幕碎了怎么办 5s用不了电信卡怎么办 vivo手机4g信号差怎么办 电信dns辅服务器未响应怎么办 笔记本wifi下载速度慢怎么办 苹果wifi下载速度慢怎么办 小米手机wifi下载速度慢怎么办 苹果8plus上网慢怎么办 小米5c死机了怎么办 苹果x自拍反方向怎么办 硅胶手机壳出油怎么办 指环扣松了怎么办图解 塑料放久了发粘怎么办 橡胶时间久了粘怎么办 胶的手机套变黄怎么办 手机壳硅胶变黄怎么办 硅胶手机壳大了怎么办 硅胶手机壳变大了怎么办 硅胶手机壳有点大怎么办 硅胶手机壳粘手怎么办 透明手机壳变黄怎么办? 耳机胶套经常掉怎么办 硅胶手机壳粘毛怎么办 耳机海绵套坏了怎么办 沙发垫海绵坏了怎么办 汽车坐海绵坏了怎么办 苹果手机边框有缝隙怎么办 孕期牙套子掉了怎么办 平果充电线不匹配怎么办 苹果六外壳掉漆怎么办 苹果平板充电没反应怎么办 苹果平板黑屏没反应怎么办 苹果平板卡机了怎么办 苹果7plus掉漆怎么办 皮的手机壳脏了怎么办 小米5x边边裂开怎么办 荣耀8的后盖摔了怎么办 hp打印机卡了纸怎么办