编译器如何实现继承?

时间:2012-11-29 07:53:30

标签: c++ inheritance

  

可能重复:
  C++: rationale behind hiding rule

假设我有一个代码:

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)"。不知道为什么编译器会在这里产生错误?

3 个答案:

答案 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。它描述了问题和解决方案。