虚继承内存分析

虚继承主要是为了解决菱形继承的问题。针对多继承的二义性本文不加分析,本文主要针对虚拟继承的内存进行分析。

首先看源码:

#include<iostream>

usingnamespace::std;

classA

{

public:

         intdataA;

};

classB: virtualpublicA

{

public:

         intdataB;

};

classC: virtualpublicA

{

public:

         intdataC;

};

classD: publicB,publicC

{

public:

         intdataD;

};

int_tmain(intargc,_TCHAR* argv[])

{

         cout<< "sizeof(A) = "<< sizeof(A)<< endl;

         cout<< "sizeof(B) = "<< sizeof(B)<< endl;

         cout<< "sizeof(C) = "<< sizeof(C)<< endl;

         cout<< "sizeof(D) = "<< sizeof(D)<< endl;

         system("pause");

         return0;

}

运行结果如下:


使用vs命令行,将ABCD四个类的内存分布图打印出来如下:


A类的内存布局中,在类中偏移量为0的位置,存储成员变量dataA


B类的内存布局中,首先存储的是一个vbptr,然后存储的是数据成员dataB,然后是存储的基类A的部分。在vbptr指向的地址存储的是偏移量8,即偏移8为基类的地址。

 

C类的布局同B一致。


D类中,首先存储的是继承自B类的部分,然后是继承自C类的部分,然后是D类自身的成员dataA,最后是基类A的部分。在图中,B类和C类都有一个vbptr,该vbptr分别指向到基类地址的偏移量。

从上面的内存分布,我们能一目了然的看出虚继承的原理。


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值