在C ++中,基类的成员函数是否会被其相同名称的派生类函数覆盖,即使其原型(参数'count,type和constness)不同?我想这是一个愚蠢的问题,因为很多网站都说功能原型应该是相同的。但为什么下面的代码没有编译?我相信这是一个非常简单的继承案例。
#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&)
答案 0 :(得分:28)
用于描述此术语的术语是“隐藏”,而不是“覆盖”。默认情况下,派生类的成员将使具有相同名称的基类的任何成员都不可访问,无论它们是否具有相同的签名。如果要访问基类成员,可以使用using
声明将它们拉入派生类。在这种情况下,请将以下内容添加到class Y
:
using X::spray;
答案 1 :(得分:10)
这就是所谓的'隐藏':Y::spray
隐藏X::spray
。
添加using指令:
class Y : public X
{
public:
using X::spray;
// ...
};
答案 2 :(得分:5)
类是范围,类范围嵌套在其父级中。您与其他嵌套作用域(名称空间,块)具有完全相同的行为。
当名称查找搜索名称的定义时,它会在当前名称空间中查找,然后在englobing名称空间中查找,直到找到一个定义;搜索然后停止(没有考虑参数依赖名称查找引入的复杂性 - 规则的一部分允许使用在其参数之一的命名空间中定义的函数。)