如何重写在多个继承中具有相同名称的基类的虚函数? [英] How to override base classes' virtual functions that have identical names in multiple inheritance?
问题描述
假设我有两个基类B1
和B2
,以及一个从B1和B2派生的类D
,如下所示:
Suppose I have two base classes B1
and B2
, and a class D
that derives from both B1 and B2 as follows:
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()
的最佳方法是什么?
In designing the class D
, I want to override the member function called foo()
from B2; however, foo()
in B1 is marked final
and prevents me from overriding foo()
in B2. What is the best approach to override foo()
from B2?
推荐答案
我认为您无法按照问题中显示的方式来做.从N3337开始,§10.3/2 [class.virtual]
I don't think what you want to do is possible in the manner you've shown in the question. From N3337, §10.3/2 [class.virtual]
如果在类
Base
和类Derived
中声明了虚拟成员函数vf
,这些成员函数直接或间接从Base
派生,则成员函数vf
具有相同的名称,参数类型-clist(8.3.5),cv限定词和ref限定词(或没有ref限定词)声明为Base::vf
,然后Derived::vf
也是虚拟的(无论是否如此声明),并且它覆盖. ...
If a virtual member function
vf
is declared in a classBase
and in a classDerived
, derived directly or indirectly fromBase
, a member functionvf
with the same name, parameter-type-list (8.3.5), cv-qualification, and ref-qualifier (or absence of same) asBase::vf
is declared, thenDerived::vf
is also virtual (whether or not it is so declared) and it overridesBase::vf
. ...
D::foo
匹配B1::foo
和B2::foo
的所有那些条件,因此它将覆盖两者.并且由于B1::foo
是final
,所以代码格式错误.
D::foo
matches all those criteria for B1::foo
and B2::foo
, hence it overrides both. And since B1::foo
is final
, the code is ill-formed.
一种解决方法是引入额外的继承级别.定义一个从B2
派生并覆盖B2::foo
的类,例如D2
.然后D
可以从B1
和D2
派生.
One workaround is to introduce an extra level of inheritance. Define a class, say D2
, that derives from B2
and overrides B2::foo
. Then D
can derive from B1
and D2
instead.
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
这篇关于如何重写在多个继承中具有相同名称的基类的虚函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!