Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
c++怎么在运行时获取一个类的类型信息RTTI_c++运行时类型识别与typeid用法_创想鸟

c++怎么在运行时获取一个类的类型信息RTTI_c++运行时类型识别与typeid用法

c++kquote>C++中typeid操作符用于运行时获取对象类型信息,需启用RTTI且类含虚函数才能正确识别多态类型,通过const std::type_info&比较类型或调用name()获取编译器编码的类型名,适用于调试与类型检查但不可移植。

c++怎么在运行时获取一个类的类型信息rtti_c++运行时类型识别与typeid用法

在C++中,运行时类型识别(RTTI, Run-Time Type Information)允许程序在运行时查询对象的实际类型。这项功能主要通过 typeid 操作符和 dynamic_cast 来实现。本文重点介绍如何使用 typeid 获取类的类型信息。

启用RTTI与编译器支持

C++默认大多数编译器都开启RTTI,但某些嵌入式或性能敏感项目可能禁用。GCC/Clang 使用 -fno-rtti 关闭,MSVC 使用 /GR-。要使用 typeid,确保没有关闭RTTI。

typeid 基本用法

typeid 是一个操作符,返回一个 const std::type_info& 引用,可用于比较类型或获取类型名称。

基本语法:

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

typeid(表达式)typeid(类型名)

示例代码:

#include #include 

class Base {public:virtual ~Base() {} // 必须有虚函数才能对指针/引用正确识别派生类型};

class Derived : public Base {};

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 193
查看详情 Find JSON Path Online

int main() {Base* ptr = new Derived;

// 使用 typeid 获取实际类型std::cout << "指针声明类型: " << typeid(ptr).name() << std::endl;std::cout << "所指对象实际类型: " << typeid(*ptr).name() << std::endl;delete ptr;return 0;

}

输出结果中的 name() 返回的是编译器编码后的字符串(如 GNU 中可能是 6Derived),可使用 c++filt 工具还原为可读名称。

使用 type_info 进行类型比较

最实用的功能是判断两个对象是否为同一类型:

Base* b1 = new Base;Base* b2 = new Derived;

if (typeid(b1) == typeid(b2)) {std::cout << "类型相同" << std::endl;} else {std::cout << "类型不同" << std::endl; // 会输出这个}

注意:必须解引用指针(*b1)才能触发多态类型检查。如果写成 typeid(b1),得到的是 Base* 类型,不是对象真实类型。

关键注意事项

类必须有至少一个虚函数(通常是虚析构函数),typeid(*ptr) 才能正确识别派生类类型。否则只返回静态类型。type_info::name() 返回值是实现定义的,不可移植。适合调试,不适合用于字符串匹配。std::type_info 不可拷贝,只能通过引用使用。对于基础类型同样有效:typeid(int)、typeid(42) 等。

配合 dynamic_cast 更安全

虽然 typeid 可以识别类型,但在需要转换指针时,推荐使用 dynamic_cast,它更安全且可检测转换失败(返回 nullptr)。

Base* ptr = new Derived;Derived* d = dynamic_cast(ptr);if (d) {    std::cout << "成功转换为 Derived" << std::endl;}

基本上就这些。typeid 是 RTTI 的核心工具之一,适用于调试、日志和类型检查场景,但要注意其限制和平台差异。合理使用能提升程序的灵活性和健壮性。

以上就是c++++怎么在运行时获取一个类的类型信息RTTI_c++运行时类型识别与typeid用法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1484930.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
c++中type traits是什么,怎么用_c++类型萃取机制type_traits库使用详解
上一篇 2025年12月19日 08:29:10
C++中i++和++i有什么区别_C++运算符区别与自增操作解析
下一篇 2025年12月19日 08:29:20

相关推荐

发表回复

登录后才能评论
关注微信