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

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

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

 

你可能感兴趣的:(overwrite 对基类同名重载函数在派生类中可见性的影响)