虚拟继承:如果关键字在某个时候被遗忘,会发生什么

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

本文关键字:被遗忘 什么 继承 如果 关键字 虚拟      更新时间:2023-10-16

如果在一大串继承中,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

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

至于避免它,

你可能应该把你的虚拟继承工作限制在你真正专注的时候,和/或尽可能避免它。

如果在大型继承链中,虚拟关键字会发生什么 在某个时候被遗忘了吗?

struct A : virtual I {};
struct B : A, virtual I {};

你为什么要"重新引入"I它已经是一个虚拟基类。你只是多余。

没有理由这样做。唯一可能的原因是放宽访问控制(或访问私有虚拟基类),并且基类在这里已经是公共的。

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