Virtual Base 类 是一个可行或有用的功能吗

Are Virtual Base classes a workable and or useful feature

我了解存在虚拟基础 class 机制以防止 "Diamond" 问题。但我很好奇这种情况是否不能通过重新设计 class 层次结构得到更好的处理。 以下面的案例为例: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。所以并不意味着我们最好标记每个虚拟继承?

class A 的虚拟继承意味着

  • A必须在最派生的class中初始化,而
  • 访问 A 的效率会降低(因为 A 子对象可以在几个派生的 class 对象之间共享,因此可以在每个)。

出于这些原因,虚拟继承要谨慎使用。

一个好的经验法则是对接口使用虚拟继承,而不是对实现使用虚拟继承classes。

您可以在 virtual 成员函数上争论相同的观点 -- 为什么不将所有成员函数都设为 virtual 因为如果有人出现并继承了您的 class 他们可能会喜欢能够覆盖您的成员函数。我们不这样做是因为对于 virtual base class,virtual 成员函数有与之相关的额外成本(在 time/resource 开销和复杂性方面)。

虚拟继承是所有具有多重继承特性的语言的必备特性。虽然有可能所有的继承案例都是虚拟的,但这有:

  • 额外费用
  • 并不总是预期的结果

因为虚继承是继承的一种特例,这里继承的是直接派生class的指令,而不是class本身。结果,每个基 class 派生另一个 class 虚拟 ,将此虚拟基作为直接基 class 提供给每个下一个派生 class.当然,如果有多个baseclass提供了相同的virtual baseclass,就会导致派生class被派生一次,但这是因为这些多个baseclass es 提供多个派生指令,但是一个 class(与正常继承相反,在这种情况下,base classes 将提供 base classes 的多个子对象)。

它始终是直接基 class 这一事实的结果是要求在每个下一个派生 class 中显式构造它。当然,默认构造函数规则适用,但 C++ 甚至不是此规则的结果 - 基 class 初始化虚拟基的代码被接受;唯一被拒绝的情况是当虚拟基地是 "competitively initialized" 在多个基地 classes - 在这种情况下你必须 "resolve the conflict" 通过提供你的建设规范。

请不要指责我蹩脚的自我推销,但我已经在这里更详细地描述了这个话题:

https://sektorvanskijlen.wordpress.com/2010/12/08/multiple-inheritance-considered-nice