C ++死亡钻石

时间:2013-06-07 15:40:59

标签: c++ inheritance diamond-problem

好的,所以当我完全控制所有类时,我理解如何解决死亡继承的钻石问题,但如果你只能控制最后一个类来继承 所以我有这个:

class A {};
class B : public A {};
class C : public A {};
class D : public B, public C {};

我无法编辑B和C只有D,有没有一种简单的方法可以做到这一点?

2 个答案:

答案 0 :(得分:3)

这是一个非常好的理由,你不能强迫BC分享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
 }
};

BC是很好的课程。他们无法处理他们不会进入的情况(i的值无效)。

如果有办法满足您的要求(struct D:B,C,其中BC分享A),那么{{1 }}?

虚拟继承意味着“我需要这个类,但我不会要求它有一些有效的值,而且我完全没问别别人了。”

答案 1 :(得分:2)

遏制假。让D包含B和C,并为D提供与B和C的公共接口的并集相同的公共接口。 然后从D的公共接口调用适当的B和C方法。

当然,你会遇到一个问题,因为它不符合继承规则,因为它不符合继承法。

简而言之,没有好办法。