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 的对象模型地址是重合的。
下需要编译器加入,要偏移到 Vertex 的地址才能赋值。
(4)虚拟继承
虚拟继承中,对象模型中只有一个 virtual base class,并且 virtual base class 处于模型的最下面。有两种常用模型,一种是每个直接 derived base class 的 class 的模型中都有一个指向 virtual base class 的指针,另一种是每个类的 vtbl 的负 offset 保存着 virtual base class 的偏移量。
就爱阅读 www.92to.com 网友整理上传, 为您提供最全的知识大全, 期待您的分享,转载请注明出处。
来源: http://www.92to.com/bangong/2017/02-20/17324142.html