typeid是C++运行时类型识别运算符,用于获取对象动态类型信息;要求类型为多态类型(含虚函数)才能体现运行时特性,支持类型比较和调试名称获取,但名称不可移植,常配合dynamic_cast实现轻量类型判断。

typeid 是 C++ 中用于运行时类型识别(RTTI)的核心运算符之一,主要作用是在程序运行期间获取对象或表达式的**动态类型信息**,尤其在涉及多态、继承和类型安全转换的场景中非常关键。
获取对象的实际类型(动态类型)
当通过基类指针或引用操作派生类对象时,typeid 返回的是对象**实际所指的类型**(即动态类型),而不是指针/引用声明的静态类型。这与 sizeof 或编译期类型推导有本质区别。
- 要求目标类型至少有一个虚函数(即必须是多态类型),否则返回的是静态类型(编译期类型)
- 对非多态类型使用 typeid 是合法的,但不体现“运行时”特性,结果在编译期就确定了
比较两个类型的是否相同
可以使用 == 或 != 直接比较两个 typeid 表达式的结果,判断它们是否代表同一类型:
- typeid(*ptr) == typeid(Derived) 可用于确认指针实际指向的是不是某个具体派生类
- 注意:比较的是 type_info 对象,不是字符串;不同编译器对同名类型的 type_info 地址可能不同,但 == 运算符已重载为语义等价判断
获取类型名称(仅作调试参考)
typeid(T).name() 返回一个实现定义的字符串(如 "N5MyLib7DerivedE"),可用于日志或调试输出:
立即学习“C++免费学习笔记(深入)”;
- 该字符串格式不跨平台、不可移植,**不能用于类型判断或字符串匹配**
- 若需可读名,可配合 abi::__cxa_demangle(GCC/Clang)或 __unDName(MSVC)进行解码,但属非标准扩展
配合 dynamic_cast 做类型安全的向下转型
虽然 dynamic_cast 本身已能安全转换并返回 nullptr,但 typeid 提供了一种更轻量的“只查不转”方式:
- 适合只需判断类型、无需转换的场景(比如分发处理逻辑)
- 相比 dynamic_cast,typeid 开销通常更低(无指针偏移计算、无虚表查找)
- 但要注意:它无法区分同一继承体系下两个无关的派生类(比如 A 和 B 都继承自 Base),只能精确匹配类型










