【发布时间】:2011-01-10 19:31:04
【问题描述】:
在 C++ 中,基类的成员函数是否会被其同名的派生类函数覆盖,即使其原型(参数的计数、类型和常量)不同?我想这是一个愚蠢的问题,因为许多网站都说函数原型应该是相同的。但是为什么下面的代码不能编译?我相信这是一个非常简单的继承案例。
#include <iostream>
using std::cout;
using std::endl;
class A {};
class B {};
class X
{
public:
void spray(A&)
{
cout << "Class A" << endl;
}
};
class Y : public X
{
public:
void spray(B&)
{
cout << "Class B" << endl;
}
};
int main()
{
A a;
B b;
Y y;
y.spray(a);
y.spray(b);
return 0;
}
GCC 抛出
error: no matching function for call to `Y::spray(A&)'
note: candidates are: void Y::spray(B&)
【问题讨论】:
-
得到了关于同一问题的 C++ 常见问题解答,如果有人需要,请详细解释:) parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.9
-
说签名应该一样有点危险。签名是名称修改和链接的基础。不同类的两个成员总是有不同的签名,即使一个覆盖另一个。我认为最好说“相同的参数类型、名称和常量”,即使说的时间更长。
-
@litb:感谢您的澄清!我想“原型”在这里是恰当的词,我在问题中改变了它:)
标签: c++ inheritance overriding