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

C++ 多级/多重继承期间对象的大小,c++,class,inheritance,virtual,C++,Class,Inheritance,Virtual,下面是多级继承的伪声明编辑:编译器与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;

下面是多级继承的伪声明编辑:编译器与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()


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

具有虚拟继承的对象的大小是特定于编译器的。请说明您希望了解的编译器的供应商和特定版本。此处可能没有填充或对齐。在本例中,额外的大小仅来自指向虚拟函数表的指针。不管怎样,这也是一种可能性。@ivarpois但这里没有虚拟函数。int数据是唯一的成员。