对象模型与多态

7 篇文章

查看专题概览 / 复习建议

核心问题

  • 虚函数表和动态绑定的基本机制是什么
  • 对象大小由哪些因素决定
  • 继承、虚继承、多态会带来哪些布局变化
  • 拷贝控制和特殊成员函数之间是什么关系
  • 多态与性能开销的权衡
  • 构造和析构期间的虚函数行为
  • 内存对齐对对象布局的影响
  • 三/五/零法则的适用场景

建议复习顺序

  1. 对象布局基础(对象大小与内存布局)
  2. 虚函数与多态(虚函数表与动态绑定)
  3. 继承访问控制与对象切片
  4. 重写、隐藏与多态接口(override/final)
  5. RTTI 与运行时类型识别
  6. 多重继承与虚继承(内存布局变化)
  7. 拷贝控制(拷贝控制与特殊成员函数)

子主题导航

高频追问

  • 为什么构造函数不能是虚函数
  • 析构函数什么时候必须是虚的
  • 空类为什么大小不是 0
  • = default= delete 解决什么问题
  • 虚函数调用的性能开销
  • 为什么会发生对象切片
  • 重写和隐藏有什么区别,为什么建议写 override
  • dynamic_caststatic_cast 的边界在哪里
  • 多重继承的内存布局
  • 移动语义与异常安全

易错点

  • 认为虚函数表是标准强制规定的唯一实现
  • 把对象大小只归结为成员变量大小之和
  • 混淆浅拷贝、深拷贝和移动
  • 混淆重写、重载、隐藏
  • 忽略构造期间的虚函数静态绑定
  • 不理解虚继承的复杂内存布局
  • 过度使用五法则而忽略零法则

学习策略

记忆技巧

对象模型三层次

  • 内存布局 = “对齐+继承+vptr”
  • 动态绑定 = “vptr+vtable+运行时查找”
  • 拷贝控制 = “三法则->五法则->零法则”

虚函数口诀

  • 基类指针 = 动态绑定
  • 对象调用 = 静态绑定
  • 构造析构 = 静态绑定
  • 多态基类 = 虚析构

关联学习

对象模型与前面的知识紧密相关:

  1. 内存管理:对象生命周期、资源管理
  2. 语言基础:继承、多态、访问控制
  3. 模板与泛型:模板类的对象模型
  4. 移动语义:移动构造和移动赋值

理解对象模型需要结合内存布局、运行时机制和语言特性。