好的,所以当我完全控制所有类时,我理解如何解决死亡继承的钻石问题,但如果你只能控制最后一个类来继承 所以我有这个:
class A {};
class B : public A {};
class C : public A {};
class D : public B, public C {};
我无法编辑B和C只有D,有没有一种简单的方法可以做到这一点?
答案 0 :(得分:3)
这是一个非常好的理由,你不能强迫B
和C
分享A
。考虑:
struct A {int i;};
struct B : A {
B(){i=3;}
void foo() {
//crash if i!=3
}
};
struct C : A {
C(){i=4;}
void bar() {
//crash if i!=4
}
};
B
和C
是很好的课程。他们无法处理他们不会进入的情况(i的值无效)。
如果有办法满足您的要求(struct D:B,C
,其中B
和C
分享A
),那么{{1 }}?
虚拟继承意味着“我需要这个类,但我不会要求它有一些有效的值,而且我完全没问别别人了。”
答案 1 :(得分:2)
遏制假。让D包含B和C,并为D提供与B和C的公共接口的并集相同的公共接口。 然后从D的公共接口调用适当的B和C方法。
当然,你会遇到一个问题,因为它不符合继承规则,因为它不符合继承法。
简而言之,没有好办法。