typeid用于运行时获取对象类型信息,属于RTTI机制,需包含头文件;其返回const std::type_info&引用,可比较类型或获取类型名;对于多态类型,typeid(*ptr)返回实际动态类型,非多态类型则返回静态类型;常与dynamic_cast配合使用,前者用于类型识别,后者用于安全向下转型;使用时需注意:不能作用于不完整类型,解引用空指针会抛出std::bad_typeid异常,type_info::name()结果依赖编译器且不可移植,性能开销较大不宜频繁调用;适合用于调试、类型诊断等场景。

在C++中,typeid操作符用于在运行时获取对象的类型信息。它属于RTTI(Run-Time Type Information,运行时类型识别)机制的一部分,常与dynamic_cast结合使用,用于安全地进行向下转型(downcasting)。下面详细介绍它的用法和注意事项。
typeid的基本用法
typeid会返回一个const std::type_info&引用,该对象唯一标识给定表达式的类型。要使用typeid,需包含头文件
示例:
- 基本类型的判断:
#include
int main() {
int a = 5;
if (typeid(a) == typeid(int)) {
std::cout }
}
- 类类型的判断:
#include
class Base { virtual ~Base() {} };
class Derived : public Base {};
int main() {
Derived d;
Base* ptr = &d;
std::cout }
输出通常为编译器修饰后的名称(如“6Derived”),可使用abi::__cxa_demangle(GCC)来还原可读名称。
立即学习“C++免费学习笔记(深入)”;
typeid与多态类型的关系
只有当作用于多态类型(即含有虚函数的类)的对象时,typeid才能反映实际的动态类型。
关键点:
- 如果指针或引用指向多态类型,typeid(*ptr) 返回的是对象的实际运行时类型;
- 若类型非多态,typeid仅返回静态类型。
示例对比:
class NonPoly { }; // 非多态类class Poly { virtual void f() {} };
class DPoly : public Poly { };
Poly* p1 = new DPoly();
NonPoly* p2 = new class DerivedNonPoly();
std::cout std::cout
typeid与dynamic_cast的配合使用
dynamic_cast用于安全的向下转型,而typeid可用于类型检查,两者用途不同但互补。
典型场景:判断指针是否指向某个具体派生类。
Base* ptr = getSomeObject();// 方法一:使用 dynamic_cast 判断并转换
Derived* d = dynamic_cast
if (d) {
// 确实是 Derived 类型
}
// 方法二:使用 typeid 比较类型
if (typeid(*ptr) == typeid(Derived)) {
std::cout }
注意:dynamic_cast要求类体系是多态的,否则无法使用引用或指针进行运行时检查。
注意事项与限制
- typeid不能用于不完整类型(如仅声明未定义的类);
- 对于空指针解引用(如typeid(*nullptr)),会抛出std::bad_typeid异常;
- type_info::name()返回的字符串是实现相关的,不可移植;
- 性能上,typeid有一定开销,频繁调用需谨慎。
基本上就这些。typeid适合做类型诊断、调试和简单判断,而dynamic_cast更适合需要安全转型的场合。合理使用它们,能增强程序的健壮性。









