one of the Microsoft documentation pages 中给出的样本有些奇怪,它包含两个类,一个是基类,另一个是派生类。基类具有以下虚拟函数成员:
virtual void setEars(string type) // virtual function
{
_earType = type;
}
还有一个在派生类中定义的对象,如注释中所述,它重新定义了虚函数:
// virtual function redefined
void setEars(string length, string type)
{
_earLength = length;
_earType = type;
}
这两个具有不同的签名,我还从未听说过您是否真的可以用另一个签名的函数重新定义虚拟函数。我编译了此示例,可以发现这两个示例之间的所有替代行为。样本只是误导还是我遗漏了一些东西?
答案 0 :(得分:8)
样本只是误导还是我遗漏了一些东西?
这个例子确实令人误解。 在派生类型中覆盖虚拟函数时,它必须具有与基类中定义的相同的签名。如果不是这种情况,则子类中的函数将被视为其自己的实体,并且在多态函数调用中不会被考虑。此外,它会隐藏基类函数的名称,这被认为是不好的做法,因为它违反了公共继承中的“ is-a”关系。
为了防止此类意外隐藏,C ++引入了override
关键字。覆盖虚拟函数时,它必须具有匹配的签名,否则,编译器将拒绝它。