C ++继承:调用重载的基类函数

时间:2015-12-25 21:08:28

标签: c++

有人可以帮我理解为什么在这种情况下重载的条形函数不起作用吗?

  class A {
  public:
     void foo(int a) {};
     void bar(int a) {};
     virtual void bar()=0;       
  };

  class B : public A{
  public:
      virtual void bar() override {};
  };

  int main(int argc, char* argv[])
  {
      B b;
      b.foo(2); // fine
      b.bar();  // fine
      b.bar(2); // not fine
  }

2 个答案:

答案 0 :(得分:3)

覆盖工作正常,但覆盖阴影基类功能。也就是说,已知类B中的名称查找只找到B中的一个,查找在那里停止。您可以使用基类资格认证,也可以使用B中的using声明或(丑陋的)手动转发器。

示例:

class B
    : public A
{
public:
    using A::bar;
    virtual void bar() override {};
};

答案 1 :(得分:0)

这实际上是在ISO C ++ FAQ中,带有代码示例

特技是添加

   public: 
   using A::bar; 

https://isocpp.org/wiki/faq/strange-inheritance#hiding-rule