关于虚继承中成员偏移量的诡异问题

http://topic.csdn.net/u/20071018/13/cb074c8d-7c12-4ec6-8208-b9677553ed85.html

class base
{
public:
int data;
};

class der1:virtual public base
{
public:
int data1;
virtual void f(){}
};

class der2:virtual public base
{
public:
int data2;
};

class der3:public der1,public der2
{
public:
int data3;
};


//程序代码:
printf("&data= %p/n", &der3::data); //0x0
printf("&data1= %p/n", &der3::data1); //0x8
printf("&data2= %p/n", &der3::data2); //0x4
printf("&data3= %p/n", &der3::data3); //0x14

使用VC2005,输出分别为0,8,4,0x14,我已知der3的对象布局如下:
vftable
vbtable
data1
vbtable
data2
data3
data
上图上每项都是4字节,一共是28字节,那么这些偏移是怎么算出来的呢?

这是因为,&der3::data等并不是数据成员在der3中的位置,而是数据成员在各自所属类中的位置,因此
&der3::data == &base::data
&der3::data1 == &der1::data1
&der3::data2 == &der2::data2

----------------------------------------------------------------------------------------------------

我看了一下这几个类的大小,和编译得到的结果,得出了这个规律:

忽略编译器给每个类分配的地址的顺序,如ls诸位所言,顺序的分配和编译器有关。

然后,你可以试着算一下编译器给类分配的地址的差值,发现
base:4Bytes
der1:12Bytes
der2:4Bytes
der3:当然没法计算了,呵呵

但是根据前面的这三个类,可以看出,这个时候编译器只分配了虚表结构的指针的大小,并没有给data数据段分配。

以上是我的理解,请各位批评指正!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值