Reg*_*ion 5 c++ multiple-inheritance
假设我有两个基类B1和B2,以及一类D使得来自两个B1和B2导出如下:
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 {
// ...
};
Run Code Online (Sandbox Code Playgroud)
在设计类时D,我想覆盖foo()从B2 调用的成员函数; 然而,foo()在B1中标记final并阻止我foo()在B2中覆盖.foo()从B2 覆盖的最佳方法是什么?
我不认为你想要做的事情是你在问题中表现出的方式.来自N3337,§10.3/ 2 [class.virtual]
如果
vf在类Base和类中声明虚拟成员函数Derived,直接或间接地从具有相同名称Base的成员函数派生vf,参数类型列表(8.3.5),cv-qualification和ref-qualifier(或如果没有Base::vf声明,那么Derived::vf它也是虚拟的(无论是否如此声明)并且它会覆盖Base::vf....
D::foo符合所有这些准则B1::foo和B2::foo,因此它覆盖两个.而且,由于B1::fooIS final,是形成不良的代码.
一种解决方法是引入额外的继承级别.例如D2,定义一个派生自B2和覆盖的类B2::foo.然后D,还可以根据B1和D2来代替.
class D2 : public B2{
public:
virtual void foo() override { cout << __PRETTY_FUNCTION__ << '\n'; }
};
class D :public B1, public D2
{};
D d;
// d.foo(); // error - ambiguous
D2& d2 = d;
d2.foo(); // calls D2::foo
B2& b2 = d;
b2.foo(); // calls D2::foo
B1& b1 = d;
b1.foo(); // calls B1::foo
Run Code Online (Sandbox Code Playgroud)