本篇摘要
本文详解 C++ RTTI 的核心组成(typeid、dynamic_cast)、底层原理(vptr、vtable)及使用场景,强调其仅适用于多态类型,并分析其开销与设计原则,指导合理应用。
RTTI(Run-Time Type Information,运行时类型信息)介绍
C++ 的 RTTI(Run-Time Type Information,运行时类型信息) 是一套在程序运行时查询和操作对象类型信息的机制。它主要用于在继承体系中安全地识别和转换对象的实际类型。
RTTI 的核心组成
C++ 标准库通过以下两个主要组件提供 RTTI 支持:
1. typeid 运算符
- 用于获取对象或类型的类型信息。
- 返回一个
const std::type_info&对象。 - 可比较两个类型是否相同。
#include <iostream>
#include <typeinfo>
class Base {
virtual ~Base() = default;
}; // 必须有虚函数!
class Derived : public Base {};
int main() {
Base* b = new Derived();
std::cout << typeid(*b).name() << std::endl; // 输出实际类型(如 "7Derived")
std::cout << (typeid(*b) == typeid(Derived)) << std::endl; // true
delete b;
}
注意:只有多态类型(含虚函数的类)才能通过基类指针/引用正确识别派生类类型。否则
typeid返回的是静态类型(即指针声明的类型也就是对应的 Base)。
2. dynamic_cast 运算符
- 用于安全地在继承层次结构中转换指针或引用(主要是向下转型)。
- 依赖 RTTI 信息进行运行时检查。





