1 对象模型
1.1 简单对象模型
- 每个
slot
指向一个members
,包括数据以及函数members
本身不在object
中,仅包含指向members的指针- $ object_size = ptr_size * members_num $
2.2 表格驱动
data member table
存储数据本身member function table
每个slot
对应一个member function
object
仅包含data member table
以及member function table
两个指针
2.3 c++对象模型
- 从简单对象模型派生
virtual table[vtbl]
:存储virtual functions
指针的表格,一般放在object
表格第一个slot
处,称为vptr
,vptr
的设定与重置由该class的构造函数或者复制运算符自动完成。object
存储非静态数据以及非静态函数以及虚拟地址表- 优点:空间以及存取时间效率;缺点:对象的非静态数据成员改变时,需要重新编译
2.4 关于继承
- 继承没有深度上的限制
2.5 关于多态
其中ZooAnimal的子类为Bear
- 多态转换会造成对象的分割:
```cpp
Bear *bear = new Bear;
ZooAnimal *zoo_animal = (ZooAnimal *)bear;
```
+ zoo_animal只能访问ZooAnimal所拥有的部分
+ 转换只能使用指针或者引用
- 对于虚函数,子类实际上是重写了虚函数地址表中函数地址,因此对于zoo_animal来讲,其如果存在虚函数,调用的是Bear中的实现。该操作是在程序运行过程中实现。