仅覆盖基 class 的同名虚函数

Overriding only some virtual funtion of base class with the same name

我有一个基 class,它有一个虚函数 foo(int i)foo()(同名,不同的参数)。
派生的 class 仅覆盖 foo().
现在派生的 class 不再知道 foo(int i)

class Base
{
public:
  virtual void foo(int i) {
    std::cout << "Base::foo(int i)" << std::endl;
  }
  virtual void foo() {
    std::cout << "Base::foo()" << std::endl;
  };
};

class Derived : public Base
{
public:
  void foo() override {
    std::cout << "Derived::foo()" << std::endl;
  }
};


int main(const int ac, const char* const av[])
{
  Base base;
  base.foo();
  base.foo(42);

  Derived derived;
  derived.foo();
  derived.foo(42);//ERROR : Function unknown
}

应该输出:

Base::foo()
Base::foo(int i)
Derived::foo()
Base::foo(int i)

问题出在哪里,解决方案是什么?
派生的 class 有时会覆盖 foo(),有时会覆盖 foo(int i),有时两者都会覆盖。

备注

如果我通过基础 class 它可以工作,但这个解决方案在我的程序中并不理想:

Derived derived;
Base* pBase = &derived;
pBase->foo();
pBase->foo(42); //WORK

编辑

好的,我在geeksforgeeks.org上发现你需要在派生class中使用using Base::foo;来导入其他foo函数。
有人知道为什么会发生什么事吗?我不想不明白一些事情。

只需在派生的 class 中添加一个 using 声明 ,如下所示。特别是,using declaration 用于 base-class 成员函数(如 foo)将该函数的所有重载实例添加到派生的范围 class.现在,您可以覆盖采用 int 类型参数的版本,并使用 using 声明 使用在派生 class 范围中添加的其他版本的实现.

class Derived : public Base
{
public:
   //added this using declaration
   using Base::foo;
  void foo() override {
    std::cout << "Derived::foo()" << std::endl;
  }
};

Working demo 上面修改后的程序输出如你所愿:

Base::foo()
Base::foo(int i)
Derived::foo()
Base::foo(int i)