直入主题:为什么虚继承能够解决“菱形继承”?
(阅读下文之前可参考下我之前总结的“ 虚函数的本质”和“ 多重继承”。)
经过gdb调试,终于揭开了面纱。
下例类结构:
Base
/ \
DerivedA DerivedB
\ /
Derived
注意:虚继承会生成虚函数指针(_vptr)和虚函数表(_vtable)。
比较下下面的数据,就会一目了然。
1. 非虚继承(数据data+非函数test())
{<DerivedA> = {<Base> =
(阅读下文之前可参考下我之前总结的“ 虚函数的本质”和“ 多重继承”。)
经过gdb调试,终于揭开了面纱。
下例类结构:
Base
/ \
DerivedA DerivedB
\ /
Derived
在非虚继承时,DerivedA和DerivedB都会继承Base的数据,从而Derived会继承2份相同的Base数据,形成“菱形继承”。
而在虚继承时,DerivedA和DerivedB都会继承Base的数据,但是Derived只会继承1份(DerivedA中)的Base数据,不会形成“菱形继承”。 (都是编译器搞的鬼)注意:虚继承会生成虚函数指针(_vptr)和虚函数表(_vtable)。
比较下下面的数据,就会一目了然。
1. 非虚继承(数据data+非函数test())
{<DerivedA> = {<Base> =