RTTI需多态类支持,通过typeid获取类型名并比较动态类型,dynamic_cast实现安全向下转型,依赖虚表存储类型信息,转换失败返回nullptr或抛异常,优先使用虚函数而非RTTI。

在C++中,运行时类型信息(RTTI, Run-Time Type Information)允许程序在运行时查询和操作对象的实际类型。RTTI主要用于支持 dynamic_cast 和 typeid 这两个特性,前提是类必须是“多态的”——即至少包含一个虚函数。
要使用 RTTI 功能,类必须具有虚函数。这是因为 RTTI 依赖虚函数表(vtable)来存储类型信息。没有虚函数的类不会生成这些额外信息,因此无法进行运行时类型识别。
注意:编译器通常默认开启 RTTI,但在某些嵌入式或性能敏感项目中可能被关闭(如使用 -fno-rtti 选项)。typeid 返回一个 const std::type_info& 引用,可用于比较类型或获取类型名称。
示例:
立即学习“C++免费学习笔记(深入)”;
#include <typeinfo>
#include <iostream>
class Base { virtual void foo() {} }; // 必须有虚函数
class Derived : public Base {};
int main() {
Derived d;
Base* b = &d;
if (typeid(*b) == typeid(Derived)) {
std::cout << "b 指向的是 Derived 对象\n";
}
std::cout << "类型名: " << typeid(*b).name() << "\n";
}
说明:
dynamic_cast 主要用于将基类指针/引用安全地转换为派生类指针/引用。转换失败时返回 nullptr(指针)或抛出 std::bad_cast(引用)。
示例(指针版本):
class Base { virtual void dummy() {} };
class Derived : public Base { public: void func() {} };
void process(Base* b) {
Derived* d = dynamic_cast<Derived*>(b);
if (d) {
d->func(); // 安全调用
} else {
std::cout << "转换失败,不是 Derived 类型\n";
}
}
示例(引用版本):
void process_ref(Base& b) {
try {
Derived& d = dynamic_cast<Derived&>(b);
d.func();
} catch (const std::bad_cast& e) {
std::cout << "引用转换失败: " << e.what() << "\n";
}
}
关键点:
RTTI 的底层实现由编译器负责,通常包括:
例如,在运行时调用 dynamic_cast<T*>(p),编译器会生成代码:
基本上就这些。RTTI 提供了灵活的运行时类型判断能力,但应谨慎使用——过度依赖可能反映设计问题。优先考虑虚函数多态,必要时再用 dynamic_cast 或 typeid 做特化处理。
以上就是C++如何实现RTTI_C++运行时类型信息(dynamic_cast, typeid)的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号