贝利信息

C++里的typeid和RTTI是什么?(运行时类型识别与动态类型检查)

日期:2026-01-09 00:00 / 作者:冰火之心
typeid用于运行时类型查询,返回std::type_info引用;限制包括:仅多态类型支持动态类型识别、需启用RTTI、空指针解引用抛bad_typeid、跨编译单元比较不可靠、对数组/引用/CV限定符敏感。

typeid 在 C++ 里怎么用,有哪些限制

typeid 是 C++ 提供的运行时类型查询操作符,返回一个 std::type_info 引用,可用于获取对象或类型的静态/动态类型信息。但它不是万能的:对非多态类型(即不含虚函数的类),typeid 返回的是**编译期类型**,而非实际对象类型。

RTTI 开启后,dynamic_cast 为什么比 static_cast 更安全

RTTI 的核心价值之一是支撑 dynamic_cast 的安全向下转型。它只对**多态类型**(含至少一个虚函数)生效,并在运行时检查继承关系是否成立。失败时,对指针返回 nullptr,对引用抛出 std::bad_cast

如何判断一个类型是否支持 RTTI(即是否多态)

不能靠 typeiddynamic_cast 是否“报错”来探测——它们的行为依赖编译选项和类型结构。最可靠的方式是在编译期用类型特征:

static_assert(std::is_polymorphic_v, "MyClass must be polymorphic for RTTI use");

常见 RTTI 相关错误和调试建议

RTTI 问题往往表现为静默错误或崩溃,而不是编译失败。典型现象包括:

立即学习“C++免费学习笔记(深入)”;

真正麻烦的是误以为 typeid 能替代接口设计:比如用一长串 if (typeid(obj) == typeid(A)) {...} else if (typeid(obj) == typeid(B))...。这不仅脆弱、难维护,还绕过了虚函数机制本应提供的扩展性。遇到这种代码,优先考虑重构为访问者模式或 std::variant(C++17)。