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

时间:2016-03-08 15:19:48

标签: c++ inheritance virtual-inheritance diamond-problem

如果在一大堆遗产中忘记virtual关键字,会发生什么?

例如:

struct I {};

struct A : virtual I {};

struct B : A, virtual I {};

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

在方法案例中,一旦方法是虚拟的,永远保持虚拟,或者struct C重新引入钻石问题?< / p>

有没有办法让编译器检查这种类型的错误,新的override关键字检查虚拟方法的正确覆盖的方式类似?

2 个答案:

答案 0 :(得分:4)

这里发生的事情如下:

  1. A获取I作为其记忆的一部分
  2. B获得A作为其记忆的一部分
  3. C准确地B 加上额外I作为其记忆的一部分
  4. 所以它不是钻石,而是更像是破碎的叉子:

    I
    |
    A
    |
    B   I
     \ /
      C
    

    此外,它并非严格意义上的错误 - 至少不是编译错误 - 而是该语言的一项功能。

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

答案 1 :(得分:0)

  

如果在大型继承链中使用virtual关键字,会发生什么   在某种程度上被遗忘?

struct A : virtual I {};

struct B : A, virtual I {};

为什么你甚至会重新推出&#34; I它已经是一个虚拟基类。你只是多余。

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

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