C++杂记——RTTI
run-time type information or run-time type identification (RTTI)
RTTI(Runtime Type Information)是C++中的一个特性,允许程序在运行时获取类型信息。它主要用于多态(尤其是基于类的多态)时,帮助判断对象的实际类型。
RTTI的主要功能
- 类型识别:使用 typeid 运算符,可以获取对象的类型信息。
- 类型转换:使用 dynamic_cast 可以安全地将基类指针或引用转换为派生类指针或引用,从而判断和使用派生类的功能。
RTTI的原理 RTTI的实现依赖于编译器在编译时生成一些额外的信息。具体来说:
- 基类信息结构:每个具有虚函数的类会有一个与之相关的“虚表”(vtable),其中包含指向虚函数的指针。同时,每个类的每个对象会有一个指向其类型信息结构的指针,通常称为“类型信息对象”(type_info)。
- typeid 操作符:使用 typeid 时,系统会查找对象的类型信息,返回对应的 std::type_info 对象,提供类名、比较等信息。
- dynamic_cast 操作符:这是一个安全的类型转换操作符,使用时系统会在运行时检查类型安全。如果目标类型与对象的实际类型不匹配,dynamic_cast 将返回 nullptr(对于指针)或者抛出 std::bad_cast 异常(对于引用)。
注意事项
- 需要虚函数:为了使用RTTI,类必须至少有一个虚函数(这样才能生成vtable和类型信息)。
- 性能开销:RTTI会引入一定的性能开销,尤其是在频繁进行类型检查和转换的场合。
- 不支持非多态类型:RTTI仅对具有虚函数的类有效,而对于普通的非虚类,类型信息在运行时不能获得。
参考
Run-time type information