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

C++ Inheritance: calling overloaded base class function

谁能帮我理解为什么重载的 bar 函数在这种情况下不起作用?

  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
  }

覆盖工作正常,但覆盖 shadows 基本 class 功能。也就是说,known class B 中的名称查找仅找到 B 中的一个,查找到此为止。您可以使用基础 class 资格,或 B 中的 using 声明,或(丑陋的)手动转发器。

示例:

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

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

技巧是添加一个

   public: 
   using A::bar; 

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