如果在一大堆遗产中忘记virtual
关键字,会发生什么?
例如:
struct I {};
struct A : virtual I {};
struct B : A, virtual I {};
struct C : B, /* virtual */ I {}; // ooops, distraction error
在方法案例中,一旦方法是虚拟的,永远保持虚拟,或者struct C
重新引入钻石问题?< / p>
有没有办法让编译器检查这种类型的错误,新的override
关键字检查虚拟方法的正确覆盖的方式类似?
答案 0 :(得分:4)
这里发生的事情如下:
A
获取I
作为其记忆的一部分B
获得A
作为其记忆的一部分B
加上额外I
作为其记忆的一部分所以它不是钻石,而是更像是破碎的叉子:
I
|
A
|
B I
\ /
C
此外,它并非严格意义上的错误 - 至少不是编译错误 - 而是该语言的一项功能。
至于避免它,你应该将你的虚拟继承工作限制在你真正专注的时候,和/或尽可能地避免它。
答案 1 :(得分:0)
如果在大型继承链中使用virtual关键字,会发生什么 在某种程度上被遗忘?
struct A : virtual I {};
struct B : A, virtual I {};
为什么你甚至会重新推出&#34; I
?它已经是一个虚拟基类。你只是多余。
没有理由这样做。唯一可能的原因是放宽访问控制(或访问私有虚拟基类),并且基类已在此公开。
所以这个问题毫无意义。当你从不重复基类名时,你不能忘记继承链中的第二个virtual
。