3

在其中一个 Microsoft 文档页面中给出了一些奇怪的示例,它由两个类组成,一个是基类,另一个是派生类。基类具有以下虚函数成员:

virtual void setEars(string type)      // virtual function
{
    _earType = type;
}

另一个在派生类中定义,如注释中所述,它重新定义了虚函数:

// virtual function redefined
void setEars(string length, string type)
{
    _earLength = length;
    _earType = type;
}

这两个有不同的签名,我从来没有听说过你是否真的可以用不同签名的函数重新定义一个虚函数。我编译了这个示例,可以找到这两者之间的任何压倒一切的行为。样品只是误导还是我遗漏了什么?

4

1 回答 1

8

样品只是误导还是我遗漏了什么?

这个例子确实具有误导性。在派生类型中重写虚函数时,它必须具有与在基类中定义的相同的签名。如果不是这种情况,子类中的函数将被视为它自己的实体,并且在多态函数调用中不被考虑。此外,它将隐藏基类函数的名称,这被认为是不好的做法,因为它违反了公共继承中的“is-a”关系。

为了防止这种意外隐藏,C++ 引入了override关键字。当覆盖一个虚函数时,它必须有一个匹配的签名,否则编译器会拒绝它。

于 2019-11-22T14:28:24.637 回答