第一章 关于对象

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++对象模型

c++ 对象模型
  • 从简单对象模型派生
  • virtual table[vtbl]:存储virtual functions指针的表格,一般放在object表格第一个slot处,称为vptrvptr的设定与重置由该class的构造函数或者复制运算符自动完成。
  • object存储非静态数据以及非静态函数以及虚拟地址表
  • 优点:空间以及存取时间效率;缺点:对象的非静态数据成员改变时,需要重新编译

2.4 关于继承

多重继承
  • 继承没有深度上的限制

2.5 关于多态

子类对象与指针的可能布局

其中ZooAnimal的子类为Bear

  • 多态转换会造成对象的分割:
```cpp
Bear *bear = new Bear;
ZooAnimal *zoo_animal = (ZooAnimal *)bear;
```
+ zoo_animal只能访问ZooAnimal所拥有的部分
+ 转换只能使用指针或者引用
  • 对于虚函数,子类实际上是重写了虚函数地址表中函数地址,因此对于zoo_animal来讲,其如果存在虚函数,调用的是Bear中的实现。该操作是在程序运行过程中实现。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容