关于虚继承中成员偏移量的诡异问题
2008-03-04 10:15
363 查看
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数据段分配。
以上是我的理解,请各位批评指正!
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数据段分配。
以上是我的理解,请各位批评指正!
相关文章推荐
- dojo中出现的一个比较诡异的问题:继承中成员变量出现公用的问题
- 关于多继承的派生类中数据成员的偏移量
- [导入]关于petshop中simplepager(继承自Repeater)覆写DataSource的问题
- 关于浏览器在调试时引起的诡异问题原因
- 关于模板类中,子类无法访问父类成员问题的解决方法
- 关于派生类拷贝构造函数中使用基类私有类对象成员的问题
- 关于CodeSmith主模板与子模板同时从一个基类继承后的参数传值问题(提供模板下载)
- OC学习中关于@private@protected@pakege@public的访问权限和继承问题
- 关于继承的问题
- c#过程中遇到的关于构造函数和继承的问题
- 关于类的静态成员函数指针的问题
- 关于C++中类的成员函数实现的位置问题
- 关于VC,GCC成员变量的内存对齐和偏移量的问题
- 关于C++赋值运算符能不能继承问题
- JAVA类继承过程中其成员的一些问题
- public protected private 成员函数和成员变量在public protected private 继承后访问权限问题
- C++中继承中的同名成员问题
- 通过V8源码看一个关于JS数组排序的诡异问题
- cocos2d-x 关于是否继承CCSprite,以及关于继承初始化时候的未知问题
- 学习笔记-----关于C++中类的成员函数可以访问私有成员的问题