⚡
对象模型与多态
7 篇文章
查看专题概览 / 复习建议
核心问题
- 虚函数表和动态绑定的基本机制是什么
- 对象大小由哪些因素决定
- 继承、虚继承、多态会带来哪些布局变化
- 拷贝控制和特殊成员函数之间是什么关系
- 多态与性能开销的权衡
- 构造和析构期间的虚函数行为
- 内存对齐对对象布局的影响
- 三/五/零法则的适用场景
建议复习顺序
- 对象布局基础(对象大小与内存布局)
- 虚函数与多态(虚函数表与动态绑定)
- 继承访问控制与对象切片
- 重写、隐藏与多态接口(override/final)
- RTTI 与运行时类型识别
- 多重继承与虚继承(内存布局变化)
- 拷贝控制(拷贝控制与特殊成员函数)
子主题导航
- 虚函数表与动态绑定.md
- 对象大小与内存布局.md
- 拷贝控制与特殊成员函数.md
- 继承访问控制与对象切片.md
- [override final与重写隐藏.md](override final与重写隐藏.md)
- RTTI与dynamic_cast和typeid.md
- 多重继承与虚继承.md
高频追问
- 为什么构造函数不能是虚函数
- 析构函数什么时候必须是虚的
- 空类为什么大小不是 0
= default和= delete解决什么问题- 虚函数调用的性能开销
- 为什么会发生对象切片
- 重写和隐藏有什么区别,为什么建议写
override dynamic_cast和static_cast的边界在哪里- 多重继承的内存布局
- 移动语义与异常安全
易错点
- 认为虚函数表是标准强制规定的唯一实现
- 把对象大小只归结为成员变量大小之和
- 混淆浅拷贝、深拷贝和移动
- 混淆重写、重载、隐藏
- 忽略构造期间的虚函数静态绑定
- 不理解虚继承的复杂内存布局
- 过度使用五法则而忽略零法则
学习策略
记忆技巧
对象模型三层次:
- 内存布局 = “对齐+继承+vptr”
- 动态绑定 = “vptr+vtable+运行时查找”
- 拷贝控制 = “三法则->五法则->零法则”
虚函数口诀:
- 基类指针 = 动态绑定
- 对象调用 = 静态绑定
- 构造析构 = 静态绑定
- 多态基类 = 虚析构
关联学习
对象模型与前面的知识紧密相关:
- 内存管理:对象生命周期、资源管理
- 语言基础:继承、多态、访问控制
- 模板与泛型:模板类的对象模型
- 移动语义:移动构造和移动赋值
理解对象模型需要结合内存布局、运行时机制和语言特性。