派生的 class 可以用不同签名的函数重新定义虚函数吗?
Can a derived class redefine virtual function with a function of different signature?
在one of the Microsoft documentation pages 中给出了一些奇怪的样本,它由两个class组成,一个是基础class,另一个是派生的。基 class 具有以下虚函数成员:
virtual void setEars(string type) // virtual function
{
_earType = type;
}
还有一个,在派生的 class 中定义,如注释中所述,它重新定义了虚函数:
// virtual function redefined
void setEars(string length, string type)
{
_earLength = length;
_earType = type;
}
这两个具有不同的签名,我从未听说过您是否真的可以使用具有不同签名的函数重新定义虚函数。我编译了这个示例,可以找到这两者之间的任何压倒一切的行为。示例是误导还是我遗漏了什么?
Is the sample just misleading or I'm missing something?
这个例子确实具有误导性。
在派生类型中重写虚函数时,它必须具有与基 class 中定义的相同的签名。如果不是这种情况,子 class 中的函数将被视为它自己的实体,并且不会在多态函数调用中被考虑。此外,它将隐藏基础 classes 函数的名称,这被认为是不好的做法,因为它违反了 public 继承中的 "is-a" 关系。
为了防止这种意外的隐藏,C++引入了override
关键字。覆盖虚函数时,它必须具有匹配的签名,否则,编译器将拒绝它。
在one of the Microsoft documentation pages 中给出了一些奇怪的样本,它由两个class组成,一个是基础class,另一个是派生的。基 class 具有以下虚函数成员:
virtual void setEars(string type) // virtual function
{
_earType = type;
}
还有一个,在派生的 class 中定义,如注释中所述,它重新定义了虚函数:
// virtual function redefined
void setEars(string length, string type)
{
_earLength = length;
_earType = type;
}
这两个具有不同的签名,我从未听说过您是否真的可以使用具有不同签名的函数重新定义虚函数。我编译了这个示例,可以找到这两者之间的任何压倒一切的行为。示例是误导还是我遗漏了什么?
Is the sample just misleading or I'm missing something?
这个例子确实具有误导性。 在派生类型中重写虚函数时,它必须具有与基 class 中定义的相同的签名。如果不是这种情况,子 class 中的函数将被视为它自己的实体,并且不会在多态函数调用中被考虑。此外,它将隐藏基础 classes 函数的名称,这被认为是不好的做法,因为它违反了 public 继承中的 "is-a" 关系。
为了防止这种意外的隐藏,C++引入了override
关键字。覆盖虚函数时,它必须具有匹配的签名,否则,编译器将拒绝它。