编译器如何实现继承

How does compiler implements inheritence?

本文关键字:实现 继承 何实现 编译器      更新时间:2023-10-16

可能的重复项:
C++:隐藏规则背后的理由

假设我有一个代码:

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 B : public A
{
  void f() {}
  using A::f;
};

此行为在 [class.member.loopkup] 中指定,尤其是 paragrah 4。

当你在B中声明void f()时,这会隐藏A继承void f(int)。您可以使用using将其恢复到范围内:

class B: public A
{      
public:
    void f() {}
    using A::f;
};

称为隐藏 - 您可以查看C++常见问题条目。它描述了问题和解决方案。