overwrite 对基类同名重载函数在派生类中可见性的影响

本文详细解析了 C++ 中的函数重载、覆盖和重写的区别及规则,并结合 C++ 名称查找规则说明了派生类如何影响基类函数的可见性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如题所述,以下讲的都是在派生类中基类的函数的可见性。

Overload(重载):在C++程序中,可以将语义、功能相似的几个函数用同一个名字表示,但参数不同(包括类型、顺序不同,个数不同),即函数重载。然后,返回值类型不能作为重载的一个判断条件。即如果函数名相同,参数个数类型和顺序也相同,仅仅是返回值不同,则不允许函数重载。
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。

Override(覆盖):是指派生类函数覆盖基类函数。既然都覆盖了基类的函数,当然也就屏蔽了基类函数了,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字    ------Override 就是为虚函数准备的罗

 

Overwrite(重写):是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual
关键字,基类的函数将被隐藏。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual
关键字(否则有virtual就是属于override的情形了)。此时,基类的函数被隐藏。

 

特别注意

如果基类有某个函数的多个重载(overload)版本,而你在子类中重写(overwrite)了其中的一个,或是子类添加新的函数版本,则所有基类的重载版本都被遮蔽。所以,正常情况下,在子类中应重写基类中的所有重载版本;

如果基类有某个函数的多个重载(overload)版本,并且其中还有一个是virtual的,而你在子类中overriide了这个基类虚函数,则所有的基类的重载版本都被屏蔽,包括基类的此虚函数。

换句话说,就是派生类中只要出现了与基类函数名一样的函数,则基类的所有的同名函数都会被屏蔽。


 为什么会被屏蔽呢?请看下面的c++名字查找规则:

1. 符号查找(对于函数此时只看名字,不看参数)
    大致顺序是
    (1)如果有限定名( XXX:: )那么就直接在XXX里查找
    (2)函数局部名字空间
    (3)(如果是成员)类名字空间
    (4)递归向上至所有基类的名字空间
    (5)当前名字空间
    (6)递归向外至所有外层名字空间,
    在任一层里, 用using导入的符号和该层的其他符号同一对待。
    keonig查找: 对于函数, 如果参数为类/结构/模版类并位于其他的名字空间,
    在(5)和(6)的查找中导入该空间(不递归向外)的符号一同查找.


编译器执行以上步骤的时候是使用贪心匹配,只要找到该名字的函数就会停止查找,所以任何一层都有可能发生错误的掩盖情况。

所以以上c++名字查找规则也就解释了为什么子类一旦有与基类同名的函数,则会屏蔽掉基类里所有的同名函数。


http://www.cppblog.com/shifan3/archive/2006/12/27/16902.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值