多级/多重继承期间的对象大小

时间:2014-03-16 04:24:32

标签: c++ class inheritance virtual

下面是多级继承的伪声明。 编辑:编译器VS C ++

Base class ( protected int data)

derived1 : virtual public base ( protected int data1 )

derived2 : virtual public base ( protected int data2)

derived3 : derived1,derived2 ( private int data3 )

Main(){ base b;    derived1 d1;   derived2 d2;   derived3 d3; }

    sizeof(b) // 4 which is correct as only int (4bytes)
    sizeof(d1) // 12 why not 8 -> 4(base) + 4(derived)
    sizeof(d2) // ??? whatever applies above should apply here
    sizeof(d3) // 24 why not 12 -> 4(base) + 4(derived1/derived2) + 4(d3).

大小是否也包括虚拟表。这里再次没有虚拟表,因为没有定义虚函数。请帮助澄清我的疑问。

PS:到目前为止我已经理解了:

  

除非函数在基类中声明为虚拟,否则

base *bptr;
 derived d;
 bptr = &d;
 bptr->fun();  // will call the base class function.
     

但是如果fun()被声明为virtual,那么上面的代码将调用派生类fun()。

1 个答案:

答案 0 :(得分:1)

允许C ++编译器根据需要添加尽可能多的填充或额外数据,并且经常将对齐内存以获得最佳RAM访问。永远不要假设任何关于物体大小的东西,除了它将>>到它的部分的大小。这里可能添加额外的4个字节以对齐到8字节边界,因此它可以与64位寄存器对齐。