美国空军的 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;
我的问题如下:
- 这在语义上是否不同于仅在声明 @ B1/B2 中虚拟继承,而不是在每个后续类声明中指定
virtual A
? - 如果它在语义上有所不同,为什么会有人/想要/放弃它?在我看来,您绝对必须在每个继承层都执行此操作,因为这会增加潜在的故障点,这对我来说似乎很愚蠢。
最佳答案
它在语义上是相同的,因为每个派生类都有 一个 A
类型的虚拟基类。显式提及虚拟基类非常好,因为大多数派生类构造虚拟基类(与非虚拟基类发生的情况不同),并且在编写派生类的构造函数时牢记构造顺序很重要。
我没有 (2) 的技术答案。你不必这样做,但如果你这样做会很好。就像调用你的 parent 一样,我想。与许多事情一样,C++ 不会强制您讲道理。
关于c++ - 在多继承场景下使用虚基类时,是不是所有的派生类都需要引用虚基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14288240/