虚拟继承:如果在某个时候忘记了关键字会发生什么?
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
关键字检查是否正确覆盖虚拟方法?
这里发生的事情如下:
A
获取 I
作为其内存的一部分
B
恰好 A
作为其内存的一部分
- 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
。
如果在一个大的继承链中,virtual
关键字在某个时候被遗忘会怎样?
例如:
struct I {};
struct A : virtual I {};
struct B : A, virtual I {};
struct C : B, /* virtual */ I {}; // ooops, distraction error
是否像方法案例一样,一旦一个方法是虚拟的,它永远保持虚拟,或者 struct C
重新引入 钻石问题?
有没有办法让编译器检查此类错误,类似于新的 override
关键字检查是否正确覆盖虚拟方法?
这里发生的事情如下:
A
获取I
作为其内存的一部分B
恰好A
作为其内存的一部分- 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
。