探究继承+virtual与不加virtual在对象内存中的分配

来源:互联网 发布:大华监控软件电视 编辑:程序博客网 时间:2024/04/29 19:30

第一个没有加 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 ,感觉好神奇,有没有?至于为什么这么保存请听下回分解。

1 0
原创粉丝点击