【发布时间】:2015-01-15 13:10:47
【问题描述】:
我了解虚拟基类机制的存在是为了防止“钻石”问题。但是我很好奇是否通过重新设计类层次结构不能更好地处理这种情况。 以下面的案例为例:copied from here
class A { public: void Foo() {} };
class B : public virtual A {};
class C : public virtual A {};
class D : public B, public C {};
我看到现在存在的机制存在的问题是,您需要能够预测某人将会出现并从 B 和 C 继承。所以并不意味着我们最好用标记每个继承虚拟的?
【问题讨论】:
-
是的,我们可以做到这一点请参阅我在 SO stackoverflow.com/questions/27457101/… 上提出的问题。但它会很混乱,很难阅读该代码。
-
从 C 和 D 继承应该可以正常工作。 A(但不是 C)。 A 类实际上是在两条链中继承的。将只有一个 A 子对象。但是,是的,这是对必须在最高继承级别做出决定的机制的有效批评。埃菲尔语言的创造者伯特兰·迈耶(Bertrand Meyer)详细阐述了这一点。
-
虚拟继承与普通继承的成本不同。
-
另外,您可能想了解所谓的“mixins”,但 IIRC 目前几乎没有库正在使用这种方法
-
也许应该从头开始设计或避免复杂的类层次结构?这意味着如果你想要一颗钻石,你应该设计一颗钻石,而不仅仅是用你发现的钻头来创造。