如何覆盖多继承中具有相同名称的基类的虚函数?

时间:2015-06-23 04:46:07

标签: c++ multiple-inheritance

假设我有两个基类B1B2,以及一个来自B1和B2的类D,如下所示:

class B1 {
public:
  // ...
  virtual void foo() final { cout << "Hello, B1\n"; }
};

class B2 {
public:
  // ...
  virtual void foo() { cout << "Good riddance, B2!\n"; }
};

class D :public B1, public B2 {
  // ...
};

在设计类D时,我想从B2覆盖名为foo()的成员函数;但是,B1中的foo()标记为final,并阻止我覆盖B2中的foo()。从B2覆盖foo()的最佳方法是什么?

1 个答案:

答案 0 :(得分:8)

我不认为您想要做的事情是以您在问题中显示的方式进行的。来自N3337,§10.3/ 2 [class.virtual]

  

如果在类vf和类Base中声明虚拟成员函数Derived,直接或间接地从Base派生,则成员函数{{1声明同名,参数类型列表(8.3.5),cv-qualification和ref-qualifier(或缺少相同),vf也是虚拟的(无论是否如此声明)并且它覆盖Base::vf。 ...

Derived::vf符合Base::vfD::foo的所有条件,因此会覆盖两者。由于B1::fooB2::foo,因此代码格式不正确。

一种解决方法是引入额外的继承级别。定义一个类B1::foo,该类派生自final并覆盖D2。然后,B2可以来自B2::fooD

B1

Live demo