第一个没有加 virtual
class A
{
public:
int _a;
};
class B : public A
{
public:
int _b;
};
class C : public A
{
public:
int _c;
};
class D : public C, public B
{
public:
int _d;
};
int main()
{
D dd;
cout<<sizeof(dd)<<endl;
dd.B::_a = 1;
dd._b = 3;
dd.C::_a = 2;
dd._c = 4;
dd._d = 5;
第二个没加virtual
class A
{
public:
int _a;
};
class B : virtual public A
{
public:
int _b;
};
class C : virtual public A
{
public:
int _c;
};
class D : public C, public B
{
public:
int _d;
};
int main()
{
D dd;
cout<<sizeof(dd)<<endl;
dd.B::_a = 1;
dd._b = 3;
dd.C::_a = 2;
dd._c = 4;
dd._d = 5;
第一个没有加virtual 开辟空间是20,这是我们意料之中的事,
第二个加了virtual 为什么就变成24 了呢,这值得探究,接下来我们通过调试与监视窗口,内存窗口,得出结论 如下图;
可以得出,加了virtual之后,编译器将_a 单独放在最后面,B和C 都有4个字节来存本身的值,还另外有4个字节存着某个地址,通过查找,知道这两个地址都保存的是0;但是下一个地址分别保存0x 0c 00 00 00 ,和0x 14 00 00 00 ,所以一推测出保存的为偏移量地址,从当前位置分别偏移12 和20 个字节恰好能找到 _a ,感觉好神奇,有没有?至于为什么这么保存请听下回分解。