【问题标题】:How does compiler implements inheritence? [duplicate]编译器如何实现继承? [复制]
【发布时间】:2012-11-17 06:05:24
【问题描述】:

可能重复:
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::f(int)’” 但是类 B 已将 A 继承为 public,因此 B 必须具有函数“void f(int s)”。不知道为什么编译器会在这里产生错误?

【问题讨论】:

  • 你不应该问“编译器是怎么做的”,而应该问“C++ 中的规则是什么......”。

标签: c++ inheritance


【解决方案1】:

这是因为B 定义了一个不同的f,它隐藏A 继承的f。如果您希望两者都在B 中可用(很可能),您必须使用 using-declaration 将其纳入范围:

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

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

【讨论】:

  • 也就是说,如果你想重载A::f(int)' with B::f()`,你必须做到以上。
  • +1 “隐藏”在这里是正确的术语。
【解决方案2】:

当您在B 中声明void f() 时,这隐藏A 继承的void f(int)。您可以使用using 将其重新纳入范围:

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

【讨论】:

  • @LuchianGrigore:谢谢,答案已更新。
  • 这两个答案大同小异。
【解决方案3】:

这称为隐藏 - 您可以查看C++ FAQ Entry。它描述了问题和解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-13
    • 2020-08-09
    • 2014-10-28
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    • 2013-12-25
    相关资源
    最近更新 更多