死亡之钻

C++ Diamond of Death

本文关键字:      更新时间:2023-10-16

好了,所以我明白了如何解决死亡之钻继承的问题,当你完全控制所有的类,但如果你只控制最后一个类继承从两个这里是:

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

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

这是一个很好的理由,你不能强迫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), D::A::i的值是多少?

虚拟继承意味着"我需要这个类,但我不需要它的一些有效值,而且我完全不介意别人乱动它"。

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

当然你会有一个问题,因为它不会遵循继承的规律。

总之,没有好的办法。

相关文章:
  • 没有找到相关文章