重载 覆盖 隐藏

先列出几个概念:

重载 overload 

覆盖 override

隐藏 name hiding

名字查找规则 name lookup

 

==========================================================================================

重载 overload

1. 必须是在同一个范围内出现的多个同名函数,同一范围可以是(A.全局作用域,B.相同名字空间,C.某个类中)

2. 多个同名函数,名字相同,参数列表不同,要么参数类型不同,要么参数个数不同

3. 函数返回类型不足以区分重载

4. 不同的重载函数意味着他们是不同的函数签名

5. 注意默认实参会给函数重载带来二义性

6. 函数重载和默认实参出现冲突时,不会在定义时报错,而是在调用使用这些函数时编译器报错,编译器不知道调用哪个

7. 重载又叫做编译时多态,编译阶段决定调用哪个函数

==========================================================================================

覆盖 override

1. 在C++11以后,override作为覆写的关键字出现,编译器利用它检查某个函数是否真的覆盖了基类中相应的函数

2. override与虚函数直接相关,就是用来实现运行时多态的,或者叫做运行时绑定,延迟绑定,运行时多态。

3. 基类中该函数前缀必须含有virtual关键字

4. 派生类和基类中,该函数的名字,参数列表,返回值必须全部相同,意味着拥有完全相同的函数签名

5. 对于完全相同的函数签名这一说法,有个例外情况:返回值为当前类的对象,引用或指针时返回值可以不同,但是可以向上转换

6. 通过基类指针或引用调用时,具体调用哪个函数,由指针(/引用)具体指向的动态类型决定

7. 如果通过实际对象调用,是不存在运行时多态的,调用关系在编译时就会决定

8. 访问权限不会影响覆盖是否成功,只会影响是否可以访问该虚函数

10. 基类指针或引用只能访问派生类中基类的部分(包括成员变量和成员方法),还有子类中的虚函数实现

==========================================================================================

隐藏 name hiding

名字查找 name lookup

名字查找有个前提:派生类的作用域是嵌套在基类的作用域内的

1. 虽然在这里把名字隐藏和重载覆盖放在一起讲,其实它们之间没有任何的联系,是完全不同的两个概念。放在这里,是避免混淆。

2. 名字隐藏不光用在类之间,也可以用在函数内,名字空间等地方。

3. 区别名字隐藏,是根据作用域来划分的,本质上跟类没有半毛钱关系。在类中的隐藏只是一个特例而已,容易与重载和覆盖混淆

4. 名字查找是从名字使用的地方开始逐步从相同作用域到外部作用域依次查找的过程。

5. 名字查找遵循就近原则,这个是在C语言就有的概念,编译器只认离使用地方最近的那个名字定义

6. 当然名字查找规则也就引起了名字隐藏。

7. 既然是名字隐藏,那么也就不需要考虑函数的参数列表了。甚至连参数列表的形参也是有可能被函数内部的变量隐藏的

8. 某个名字空间内的名字会隐藏它外部同名的名字,某个子类中的名字会隐藏基类中同名的名字。

   既然是名字,那么有可能是变量,也有可能是函数。

9. 基类中的函数只能访问基类中的成员,不能访问子类的成员。这是先有鸡还是先有蛋的问题。

 

转载于:https://www.cnblogs.com/lizckevin/articles/7096852.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值