我有3个班级A
,B
和C
,其中B
是A
而C
是{{1} }}
这些类旨在保留历史记录,因此A
提供了一个虚拟方法,派生类可以创建该方法,以便在归档历史记录时通知,称为A
。
现在突然需要在一个班级中提供void archive()
,A
和B
的信息,我不确定最佳方法。
我考虑创建一个继承自C
和D
的新类B
,并将其继承更改为C
以避免diamond problem并拥有virtual public A
{1}}只需致电D::archive()
和B::archive()
。
这是一个好方法吗?或者我应该重新设计4个类,以便我不使用多重继承?
答案 0 :(得分:5)
您的方法是标准方法。 C ++具有多重继承,您可以随意使用它。看起来你知道如何正确地做到这一点。
答案 1 :(得分:5)
如何使用构图呢?
例如。 class D
委托代理B
和C
而不是继承。
组合可以实现相同的结果,代码更简单(恕我直言)
答案 2 :(得分:1)
请注意最终覆盖方法可能具有的调用链:
如果B::method
调用A::method
和C::method
调用A::method
,则当您将它们放在D中时,如果D::method
同时调用C::method
,则将其设为虚拟和B::method
,你得到A::method
两次。
当一个基础变为虚拟时,你必须避免这种重新入侵。
答案 3 :(得分:0)
你可以从A派生D,包含两个成员B和C. D :: archive将调用B :: archive和C :: archive