2

好的,所以当您完全控制所有类时,我了解如何解决死亡继承钻石的问题,但是如果您只能控制要从两者继承的最后一个类怎么办所以我有这个:

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

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

4

2 回答 2

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
 }
};

B并且C是好课。他们无法处理他们不会进入的情况(i 的值无效)。

如果有一种方法可以满足您的要求(struct D:B,C、 whereBCshare A),那么 的价值是D::A::i多少?

虚拟继承意味着“我需要这个类,但我不需要它的一些有效值,而且我完全可以接受其他人的干扰”。

于 2013-06-07T15:52:50.010 回答
2

通过收容来伪造它。让 D 包含 B 和 C 并给 D 与 B 和 C 的公共接口的并集相同的公共接口。然后从 D 的公共接口调用 B 和 C 的相应方法。

当然,你会遇到转换和多态性的问题,因为它不遵循继承法则。

简而言之,没有什么好办法。

于 2013-06-07T16:04:05.030 回答