查看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指针。这里为了方便我做个图直观一点: