【问题标题】:When using a virtual base class in a multiple inheritance scenario, is it necessary for all derived classes to reference the virtual base?在多继承场景中使用虚拟基类时,是否所有派生类都必须引用虚拟基类?
【发布时间】:2013-01-11 23:19:37
【问题描述】:

美国空军的 JSF C++ 编码标准要求为访问虚拟基的每个派生类声明虚拟基类。

例如,在以下层次结构中:

  A
 / \
B1  B2
C1  C2
 \ /
  D

...他们在本标准中强加的规则(AV 规则 88.1,供参考)要求类声明如下:

class A;
class B1 : virtual A;
class B2 : virtual A;
class C1 : B1, virtual A;
class C2 : B2, virtual A;
class D  : C1, C2, virtual A;

我的问题如下:

  1. 这在语义上是否不同于仅在声明 @B1/B2 中虚拟继承,而不是在每个后​​续类声明中指定 virtual A
  2. 如果它在语义上有所不同,为什么会有人/想要/放弃它?在我看来,您绝对必须在每一层继承中都这样做是很愚蠢的,因为这会增加潜在的故障点。

【问题讨论】:

    标签: c++ virtual-inheritance


    【解决方案1】:

    它在语义上是相同的,因为每个派生类都将具有 一个 类型为A 的虚拟基。显式地提及虚基非常好,因为最派生类构造虚基(与非虚基不同),并且在编写派生类的构造函数时要牢记构造顺序。

    我没有 (2) 的技术答案。你不必这样做,但如果你这样做会很好。就像打电话给你的父母一样,我想。与许多事情一样,C++ 并不强迫你讲道理。

    【讨论】:

    • 我希望我能再给我一个 +1 的笑声。但说真的,我想澄清一点。为什么要关心派生最多的类型是否构造了虚拟基?你是否还有可能最终得到两个As?
    • @BrianVandenberg:不,但是您必须注意初始化顺序,并且您必须记住只有最派生的类才能构造(唯一)虚拟基。想想中级班对此的感受。一个不平凡的例子需要一些代码来拼写出来,但话又说回来,虚拟继承是一个非常神秘的语言功能......但试着自己解决它,看看顺序有多重要。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 2014-11-23
    • 2016-03-04
    相关资源
    最近更新 更多