编译器如何实现继承?

Aza*_*zle 0 c++ inheritance

可能重复:
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)".不知道为什么编译器在这里产生错误?

Rei*_*ica 5

那是因为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.