c++ - 在多继承场景下使用虚基类时,是不是所有的派生类都需要引用虚基类?

标签 c++ virtual-inheritance

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

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

  A
 / \
B1  B2
C1  C2
 \ /
  D

...他们在本标准中施加的规则(AV Rule 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. 如果它在语义上有所不同,为什么会有人/想要/放弃它?在我看来,您绝对必须在每个继承层都执行此操作,因为这会增加潜在的故障点,这对我来说似乎很愚蠢。

最佳答案

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

我没有 (2) 的技术答案。你不必这样做,但如果你这样做会很好。就像调用你的 parent 一样,我想。与许多事情一样,C++ 不会强制您讲道理。

关于c++ - 在多继承场景下使用虚基类时,是不是所有的派生类都需要引用虚基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14288240/

相关文章:

c++ - 虚继承和虚函数使用同一个虚表吗?

c++ - 如何在从A继承B的同时从B继承类A?

c++ - 虚拟继承表在 g++ 中是如何工作的?

c++ - 从文本文件中读取一行并将其存储到 C++ 中的二维 vector 中

C++,bool 转换是否总是退回到 void* 的隐式转换?

C++如何使用less条件语句?

c++ - OpenGL 视口(viewport)失真

c++ - 如何在 C++ 编译时打印一个完整的模板参数

c++ - C++ 中的密封类和虚拟继承