粗看了<>,做了一个试验,但还是有些不解。(大家一起讨论吧)
代码如下,我主要想验证一下第三章作者说的data布局那块。
#include <iostream.h>
class X {void pp(){cout<<"dsdf"<<endl;};};
class Y : public virtual X
{
public:
int yy;
};
class Z : public virtual X
{
public:
int zz;
};
class A : public Y, public Z {};
void main()
{
int s,d;
Y y,yy;
A aa;
aa.yy=0x12345678;
aa.zz=0x87654321;
int* a=(int *)(&aa) ;
s=*(a+2);
d=*(a+6);
cout<<hex<<s<<endl<<d<<endl;
}
vc6 debug模式内存dump如下:
0012FF58 34 80 42 00 78 56 34 12
0012FF60 28 80 42 00 21 43 65 87
0012FF68 1C 80 42 00 CC CC CC CC
0012FF70 1C 80 42 00 CC CC CC CC
0012FF78 CC CC CC CC CC CC CC CC
0x0012ff58是aa的首地址,理论上来说,前八个字节似乎为Y子对象,后八个字节为Z子对象,且各自的
前四个字节应该相同,因为他们Y和Z有共同的虚基类X。事实上不同,不知为什么?
另外0x0012FF68处和0012FF78相同,我怀疑他们才是指向虚基类的指针,可布局又不对啊。
大家讨论讨论,争取把这个问题弄清,共同进步嘛。