dynamic_cast的实现原理
dynamic_cast 是 C++ 中用于在继承层次间进行安全向下转型(downcasting)或交叉转型(crosscasting)的运算符,其核心原理基于运行时类型信息(RTTI)和虚函数表(VTable)。
核心依赖
- RTTI(运行时类型信息):
编译器为每个包含虚函数的类生成type_info
对象,存储类的名称、继承关系等元数据。 - 虚函数表(VTable):
每个包含虚函数的类都有一个虚函数表,其起始位置存储指向type_info
的指针,用于运行时类型查询。
实现机制
(1)向下转型(Downcasting)
- 场景:将基类指针 / 引用转换为派生类指针 / 引用。
- 步骤:
- 通过基类指针找到虚函数表。
- 从虚函数表获取
type_info
,确定实际对象类型。 - 检查实际类型是否为目标派生类或其派生类。
- 若是,则计算派生类对象在内存中的偏移量(多重继承时可能不为 0),返回正确指针;否则返回
nullptr
(指针转换)或抛出std::bad_cast
异常(引用转换)。
(2)交叉转型(Crosscasting)
- 场景:在多继承体系中,将指针从一个兄弟派生类转换到另一个兄弟派生类。
- 步骤:
- 通过当前派生类指针找到虚函数表,获取实际类型。
- 遍历继承关系树,找到两个派生类的共同基类。
- 计算目标派生类相对于共同基类的偏移量,调整指针地址。
关键条件
- 必须有虚函数:若类无虚函数,
dynamic_cast
无法工作(编译报错或行为未定义)。 - 仅适用于多态类型:基类必须是多态类型(即包含虚函数),否则无法进行运行时类型检查。
性能开销
- 时间开销:涉及虚函数表查找、类型比较和偏移量计算,比静态类型转换(如
static_cast
)慢。 - 空间开销:每个包含虚函数的类需额外存储
type_info
指针。