C++ 编译器如何实现继承性?
可能重复:C++ 编译器如何实现继承性?,c++,inheritance,C++,Inheritance,可能重复: 假设我有一个代码: class A { public: void f(int s) {} }; class B:public A { public: void f() {} }; int main() { B ob; ob.f(4); } 然后,在本例中,编译器生成一个错误,即“调用'B::f(int)'时没有匹配的函数” 但是B类继承了A作为公共,因此B必须具有函数“void f(int s)
假设我有一个代码:
class A
{
public:
void f(int s) {}
};
class B:public A
{
public:
void f() {}
};
int main()
{ B ob;
ob.f(4);
}
然后,在本例中,编译器生成一个错误,即“调用'B::f(int)'时没有匹配的函数”
但是B类继承了A作为公共,因此B必须具有函数“void f(int s)”。不知道编译器为什么在这里生成错误?这是因为
B
定义了一个不同的f
,它隐藏了从a
继承的f
。如果您想在B
中同时使用这两个选项(很可能),则必须使用using声明将其纳入范围:
这种行为在[class.member.loopkup]中有规定,特别是第4段。当您在
B
中声明void f()
时,这将隐藏从A
继承的void f(int)
。您可以使用将其重新纳入范围:
class B: public A
{
public:
void f() {}
using A::f;
};
这就是所谓的隐藏-你可以检查。它描述了问题和解决方案。即,如果你想超载<代码>::(f)(int),用“/COD>B::F~()”,你必须做到以上。+ 1“隐藏”是正确的术语。@鲁基安格雷戈:谢谢,回答得更新。这两个答案非常相同。你不应该问“编译器是怎么做的”,而是“C++中的规则是什么……”。
class B: public A
{
public:
void f() {}
using A::f;
};