可能重复:
C++:隐藏规则背后的基本原理
假设我有一个代码:
class A
{
public:
void f(int s) {}
};
class B:public A
{
public:
void f() {}
};
int main()
{ B ob;
ob.f(4);
}
Run Code Online (Sandbox Code Playgroud)
然后在这种情况下,编译器会生成一个错误"没有匹配函数来调用'B :: f(int)'"但是B类继承了A作为公共,因此B必须具有函数"void f(int s)".不知道为什么编译器在这里产生错误?
那是因为B定义了一个不同的f,隐藏了f继承的A.如果您希望两者都可用B(可能),则必须使用using声明将其带入范围:
class B : public A
{
void f() {}
using A::f;
};
Run Code Online (Sandbox Code Playgroud)
此行为在[class.member.loopkup]中指定,尤其是paragrah 4.