对象的意外布局实际上是从基类继承的

时间:2015-07-17 11:53:44

标签: c++ gcc

考虑以下代码:

class B
{
    public:

    int a=10;
    B()
    {
        cout << "B() at: "<<this<<endl;
        cout << "Sizeof: " << sizeof(*this) << endl;
        cout <<endl<<endl;
    }

    };

class D1: virtual public B
{
    public:

    int a=20;
    D1()
    {
        cout << "D1() at: "<<this<<endl;
        cout << "Sizeof: " << sizeof(*this) << endl;

        cout << *((int *) this) << endl;
        cout << *((int *) this+1) << endl;
        cout << *((int *) this+2) << endl;
        cout << *((int *) this+3) << endl; 
        cout <<endl<<endl;
    }
};

class D2: public D1
{
    public:

    int a=30;
    D2()
    {
        cout << "D2() at: "<<this<<endl;
        cout << "Sizeof: " << sizeof(*this) << endl;
        cout <<endl<<endl;
    }
};

当我实例化D2对象时,会给出以下输出:

B() at: 0x22ff0c
Sizeof: 4


D1() at: 0x22ff00
Sizeof: 12
4659268
20
2293652
10


D2() at: 0x22ff00
Sizeof: 16

D1的大小是12个字节,因为它包含自己的整数,从B继承的整数和指向vtable的指针?

为什么D1的空间和B空间之间存在差距? (为什么在20岁之后才出现?)

我认为D2对象的内存布局与此类似

***D2*************
*                * 
* ***D1***********
* *             ** 
* * vptr        **
* * int         **
* ****************
* int            * 
* **B*************
* *             ** 
* * int         **
* ****************
* ****************  

我的想象布局有什么错误吗?

使用的编译器是gcc。

0 个答案:

没有答案