下面是多级继承的伪声明。 编辑:编译器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()。
答案 0 :(得分:1)
允许C ++编译器根据需要添加尽可能多的填充或额外数据,并且经常将对齐内存以获得最佳RAM访问。永远不要假设任何关于物体大小的东西,除了它将>>到它的部分的大小。这里可能添加额外的4个字节以对齐到8字节边界,因此它可以与64位寄存器对齐。