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

C++ Inheritance: calling overloaded base class function

本文关键字:基类 类函数 重载 调用 继承 C++      更新时间:2023-10-16

有人能帮我理解为什么重载的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
  }

重写工作正常,但重写会隐藏基类函数。也就是说,在已知类B中的名称查找只找到B中的一个,查找到此为止。您可以使用基类限定,也可以使用B中的using声明,或者(丑陋的)手动转发器。

示例:

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

这实际上在ISO C++常见问题解答中,代码示例为

技巧是添加

   public: 
   using A::bar; 

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