在多重继承场景中使用虚拟基类时,是否所有派生类都必须引用虚拟基类? 美国空军的JSF C++编码标准要求为访问虚拟基础的每个派生类声明虚拟基类。

在多重继承场景中使用虚拟基类时,是否所有派生类都必须引用虚拟基类? 美国空军的JSF C++编码标准要求为访问虚拟基础的每个派生类声明虚拟基类。,c++,virtual-inheritance,C++,Virtual Inheritance,例如,在以下层次结构中: 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; 我的问题如下: 这在语义上是否不同于仅在声明@B1/B2中进

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

  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;
我的问题如下:

  • 这在语义上是否不同于仅在声明@B1/B2中进行虚拟继承,而不在随后的每个类声明中指定
    virtuala
  • 如果它在语义上不同,为什么会有人/想要/放弃它?在我看来,在继承的每一层都必须这样做是愚蠢的,因为这会增加潜在的失败点

  • 它在语义上是相同的,因为每个派生类将恰好有一个
    A
    类型的虚拟基。显式地定义虚拟基非常好,因为派生最多的类构造虚拟基(与非虚拟基不同),并且在编写派生类的构造函数时,必须记住构造顺序


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

    我希望我能再给1的笑声。但是,非常严肃地说,我想要一个小小的澄清。为什么您会关心最派生的类型是否构造虚拟基?您是否仍有可能最终得到两个
    A
    s?@BrianVandenberg:没有,但是您必须小心初始化顺序,并且您必须记住,只有派生最丰富的类才能构造(唯一的)虚拟基。想想中间阶层对此的感受。一个非平凡的例子需要一点代码来解释,但同样,虚拟继承从一开始就是一个非常神秘的语言特性。。。但是试着自己解决,看看顺序有多重要。