

新闻资讯
技术学院RTTI是C++标准组成部分,含typeid、dynamic_cast和异常类型识别;dynamic_cast依赖vtable实现安全向下/横向转换,仅适用于多态类型,失败时指针返回nullptr、引用抛bad_cast;应限用于异构容器处理等必要场景,避免替代虚函数。
RTTI(Run-Time Type Information,运行时类型识别)是C++提供的一组机制,用于在程序运行期间获取对象的类型信息,并支持安全的向下类型转换。它不是“可选功能”,而是标准C++的一部分,但需要开启RTTI支持(绝大多数编译器默认开启,如g++/clang默认启用,MSVC需确认未加/GR-)。
RTTI主要由三个语言级设施构成:
typeid操作符:返回std::type_info对象,可用于比较类型、获取类型名(注意:name()返回的是实现定义的字符串,不可直接用于跨平台字符串比较)dynamic_cast:唯一能在继承体系中执行安全向下转型(downcast)或横向转型(cross-cast)的C++强制转换操作符,仅对多态类型(含虚函数的类)有效catch(...)捕获异常后,可通过typeid识别实际抛出类型(较少显式使用)dynamic_cas不是简单查表,它依赖类的虚函数表(vtable)中嵌入的RTTI数据(如type_info指针、继承关系偏移量等)。转换是否成功,取决于运行时对象的真实类型是否满足目标类型要求。
t
nullptr,可安全判空std::bad_cast异常,必须用try-catch捕获示例:
class Base { virtual ~Base() = default; };它不是设计缺陷的补救工具,而是面向特定场景的必要手段:
std::vector<:unique_ptr>>),需对特定子类型做特殊操作;调试/日志中识别实际类型;插件系统中按能力查询接口dynamic_cast比static_cast慢,因需遍历继承链并查RTTI数据,但在现代CPU上单次调用开销极小;真正影响性能的是滥用(如循环内反复转换)关闭RTTI(如g++加-fno-rtti)会禁用typeid和dynamic_cast,编译器报错。部分嵌入式或游戏引擎会关掉它以减小二进制体积、提升启动速度、规避某些安全扫描误报。
static_cast或reinterpret_cast,但失去类型安全性dynamic_cast效果,须手动实现类型ID机制(如枚举+虚函数getType()),但无法保证转换合法性