假设我有一个代码:
class A
{
public:
void f(int s) {}
};
class B:public A
{
public:
void f() {}
};
int main()
{ B ob;
ob.f(4);
}
然后在这种情况下,编译器会生成一个错误,即#B;没有匹配函数来调用'B :: f(int)'" 但是B类继承了A作为公共,因此B必须具有函数" void f(int s)"。不知道为什么编译器会在这里产生错误?
答案 0 :(得分:5)
这是因为B
定义了不同的f
,隐藏从f
继承的A
。如果您希望B
(可能)都可用,则必须使用 using-declaration将其带入范围:
class B : public A
{
void f() {}
using A::f;
};
此行为在[class.member.loopkup]中指定,尤其是第4段。
答案 1 :(得分:3)
当您在void f()
中声明B
时,此会隐藏从void f(int)
继承的A
。您可以使用using
:
class B: public A
{
public:
void f() {}
using A::f;
};
答案 2 :(得分:0)
这称为隐藏 - 您可以查看C++ FAQ Entry。它描述了问题和解决方案。