Microsoft文档页面之一中给出了一些奇怪的示例,该示例页面由两个类组成,一个是基类,另一个是派生类。基类具有以下虚拟函数成员:
virtual void setEars(string type) // virtual function
{
_earType = type;
}
另一个在派生类中定义,如注释所述,它重新定义了虚函数:
// virtual function redefined
void setEars(string length, string type)
{
_earLength = length;
_earType = type;
}
这两个具有不同的签名,我还从未听说过您是否真的可以用另一个签名的函数来重新定义虚拟函数。我编译了此示例,可以发现这两个示例之间的所有替代行为。样本只是令人误解还是我遗漏了一些东西?
样本只是令人误解还是我遗漏了一些东西?
这个例子确实令人误解。在派生类型中覆盖虚拟函数时,它必须具有与基类中定义的相同的签名。如果不是这种情况,则子类中的函数将被视为其自己的实体,并且在多态函数调用中不会被考虑。另外,它会隐藏基类函数的名称,这被认为是不好的做法,因为它违反了公共继承中的“ is-a”关系。
为了防止此类意外隐藏,C ++引入了override
关键字。覆盖虚拟函数时,它必须具有匹配的签名,否则,编译器将拒绝它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句