单继承的虚表布局
vptr
,指向虚函数表(vtable)。表中按声明顺序存储所有虚函数的地址。// 示例:资料6中的虚表扩展逻辑
Base* obj = new Derived();
// obj->vptr 指向的虚表结构:[Base::func1, Derived::func2, Derived::func3]
多继承的虚表布局
vptr
,按继承顺序排列在对象头部。 this
指针(如资料1中d2_ptr->show()
需调整this-0x10
)。 虚继承的内存布局
// 资料1中的虚继承示例
class Derived2 : virtual public Base { /*...*/ };
// 内存布局:[Derived2的vptr, 成员变量, vbptr, Base子对象]
关键修正与标准引用
dynamic_cast
依赖虚表中的RTTI信息,通过调整this
指针实现跨继承层级的转换(如资料2的dynamic_cast<void*>(b)
)。 总结
继承类型 | vptr数量 | 虚表扩展逻辑 | 内存调整关键点 |
---|---|---|---|
单继承 | 1个(基类vptr) | 追加新虚函数到基类虚表末尾 | 无this指针调整 |
多继承 | 每个基类1个vptr | 新虚函数追加到第一个基类虚表 | 需跨基类调整this指针 |
虚继承 | 基类vptr+vbptr | 虚基类偏移量通过虚基表管理 | 解决菱形继承冗余 |