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会返回一个const std::type_info&引用,该对象唯一标识给定表达式的类型。要使用typeid,需包含头文件
示例:
输出通常为编译器修饰后的名称(如“6Derived”),可使用abi::__cxa_demangle(GCC)来还原可读名称。
只有当作用于多态类型(即含有虚函数的类)的对象时,typeid才能反映实际的动态类型。
关键点:
示例对比:
class NonPoly { }; // 非多态类
y* p2 = new class DerivedNonPoly();dynamic_cast用于安全的向下转型,而typeid可用于类型检查,两者用途不同但互补。
典型场景:判断指针是否指向某个具体派生类。
Base* ptr = getSomeObject();注意:dynamic_cast要求类体系是多态的,否则无法使用引用或指针进行运行时检查。
基本上就这些。typeid适合做类型诊断、调试和简单判断,而dynamic_cast更适合需要安全转型的场合。合理使用它们,能增强程序的健壮性。