虚拟继承的原理 虚拟继承解决数据冗余和二义性的奥秘就在于,它在继承之后并不会创造出两个基类成员给派生类各自继承,而是在派生类中记录两个偏移量,大小为从派生类中继承的基类成员的地址到真正的基类成员地址,而这个真正的成员,被放在最后一次继承的派生类(D类)的末尾。 如图所示,在不使用虚拟继承的前提下,各个类定义定义变量后我们可以看看他们各自所处的地址如下: 可以看出,A,B类继承的m_n处于不同的地址,是两个成员。而使用虚拟继承后他们所处地址的内容变成了如下: 可以看出,原本为值‘3’和‘4’的地方变成了两个偏移量,而我们调取这两个偏移量之后可以看到如下: e8 d2 f5 00 :12(H) ac cb f5 00 :20(H) 而我们发现,从起始位置到下面04的位置(D类中的末尾),偏移字节正好是12和20。 其实,这里是通过B和C的两个指针,指向一张表,这两个指针叫做虚基表指针,这两个表叫虚基表,虚基表中存的偏移量,通过偏移量可以找到下面的A。 Ps:并不是所有派生类共用一分虚基表,每个派生类都有自己的表;
虚拟继承解决二义性及数据冗余的原理
原创
©著作权归作者所有:来自51CTO博客作者见风是风的原创作品,请联系作者获取转载授权,否则将追究法律责任
上一篇:赋值兼容原则
下一篇:通过初始化列表初始的情况
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
文法的二义性和化简
文法的二义性和化简
二义性 文法 -
菱形继承问题python 菱形继承的二义性
多重继承:一个派生类继承了两个或两个以上的基类。如图 如果在多重继承中Class A 和Class B存在同名数
菱形继承问题python c++ 虚基类 初始化 派生类