C++之4种情况的对象模型:1.一个空类的大小是1byte,因为要区别两个不同的object,在内存中配置独一无二的地址。
class A{}
2.4种情况的对象模型:单继承无多态,单继承有多态,多重继承,虚继承。
(1)单继承无多态
(2)单继承有多态
注意:单继承中,vptr只有一个,derived class改变base class的vptr,指向自己的vtbl。
(3)多重继承
注意
多重继承中,有多个vptr,每一个base就有一个vptr。
对象模型按照继承base顺序
对于下面代码
Vertex *pv;
Point2d *p2d;
Vertex3d v3d;
p2d=&v3d;//直接赋值
pv=&v3d;//编译器转换
上可以直接赋值的原因是Point2d 和Vertex3d 的对象模型地址是重合的。
下需要编译器加入,要偏移到Vertex的地址才能赋值。
(4)虚拟继承
虚拟继承中,对象模型中只有一个virtual base class,并且virtual base class处于模型的最下面。有两种常用模型,一种是每个直接derived base class的class的模型中都有一个指向virtual base class的指针,另一种是每个类的vtbl的负offset保存着virtual base class的偏移量。