假设我有两个基类B1
和B2
,以及一个来自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()
的最佳方法是什么?
答案 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::vf
和D::foo
的所有条件,因此会覆盖两者。由于B1::foo
为B2::foo
,因此代码格式不正确。
一种解决方法是引入额外的继承级别。定义一个类B1::foo
,该类派生自final
并覆盖D2
。然后,B2
可以来自B2::foo
和D
。
B1