2013亚马逊面试题--虚继承的内存模型分析

发表于:2013-1-18 09:36

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:wangqiulin123456    来源:51Testing软件测试网采编

分享:

  查看Derived这个类的对象在内存中的布局,那么就可以用下面的命令行:

cl Test.cpp /d1reportSingleClassLayoutDerived

  结果显示如下:

  可以看到class Derived的对象的内存布局,在派生类对象的开始包含了基类Base的对象,其中有一个虚表指针,指向的就是下面的Derived::$vftable@ (virtual function table),表中包含了Derived类中所有的虚函数。

  内存模型

  在这一小节里面我主要从他面试的几个题目中来谈谈虚继承的内存模型。

  代码一:

class A
{
    virtual void a()
    {
    }
};
class A1
{
    virtual void a()
    {
    }
};

class B : public A , virtual public A1
{
};
void main()
{
    cout<<"sizeof A: "<<sizeof(A)<<endl;
    cout<<"sizeof A1: "<<sizeof(A1)<<endl;
    cout<<"sizeof B: "<<sizeof(B)<<endl; &nbsp; &nbsp; //&nbsp;
}

  输出结果是:

  在命令行中输入:

cl test.cpp /d1reportSingleClassLayoutB

  从这个内存布局就可以看出来class A、class A1和ClassB的大小,本身class A的大小应该是1bytes的内存定位大小加上虚函数指针4bytes因为有了虚函数指针后1bytes的占位就可以取消了。所以A的大小就是4bytes,同理Class A1。对于Class B它主要是从class A和class A1(虚继承)而来,所以B里面包含有一个A和A1同时因为是需继承所以就有一个指向虚基类(A1)的vbptr指针。这里为了方便我做个图直观一点:

52/5<12345>
春暖花开更文季,点击参与还有惊喜礼品~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海漕溪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号