虚拟继承:如果在某个时候忘记了关键字会发生什么?

Virtual Inheritance: what happens if the keyword is at some point forgotten?

如果在一个大的继承链中,virtual 关键字在某个时候被遗忘会怎样?

例如:

struct I {};

struct A : virtual I {};

struct B : A, virtual I {};

struct C : B, /* virtual */ I {};   // ooops, distraction error

是否像方法案例一样,一旦一个方法是虚拟的,它永远保持虚拟,或者 struct C 重新引入 钻石问题?

有没有办法让编译器检查此类错误,类似于新的 override 关键字检查是否正确覆盖虚拟方法?

这里发生的事情如下:

  1. A 获取 I 作为其内存的一部分
  2. B 恰好 A 作为其内存的一部分
  3. C 正好 B 加上 一个额外的 I 作为其内存的一部分

所以它不是钻石,更像是断叉:

I
|
A
|
B   I
 \ /
  C

另外,严格来说这不是错误——至少不是编译错误——而是语言的一个特性。

至于避免它,你应该将你的虚拟继承工作限制在你真正专注的时候,and/or尽可能避免它。

What happens if, in a large chain of inheritances, the virtual keyword is at some point forgotten?

struct A : virtual I {};

struct B : A, virtual I {};

为什么还要"reintroduce"I已经是虚拟基地了class。你只是多余的。

没有理由这样做。唯一可能的原因是放松访问控制(或获得对私有虚拟基地 class 的访问权限),而基地 class 已经 public 在这里。

所以这个问题毫无意义。当您从不重复基础 class 名称时,您就不会忘记继承链中的第二个 virtual