讲师中心 微信公众号
AI工具推荐 视频效率加速

c++中如何获取类的名称_c++ typeid运算符使用【进阶】

胖晨吖_2623

胖晨吖_2623

发布时间:2026-03-09 12:55:57

|

439人浏览过

|

来源于php中文网

原创

typeid 的 name() 字符串不可直接比较,因 GCC/Clang 返回 mangled 名(如 "N12MyNamespace7MyClassE"),MSVC 类似,需用 abi::__cxa_demangle 或 __unDName 解码且手动释放内存;多态识别需基类含虚函数(如虚析构);跨平台应优先使用 hash_code() 作类型标识。

c++中如何获取类的名称_c++ typeid运算符使用【进阶】

typeid 返回的 name() 字符串不可直接比较

用 typeid(obj).name() 拿到的名字是编译器实现相关的,GCC/Clang 返回的是 mangled 名(比如 "N12MyNamespace7MyClassE"),MSVC 也类似,不是可读字符串。直接拿它做 == 判断或日志输出,大概率出错或看不懂。

  • 需要先调用 abi::__cxa_demangle()(GCC/Clang)或 __unDName()(MSVC)解码,否则看到的不是类名
  • 解码后内存需手动 free(),漏掉会内存泄漏
  • 跨平台项目里,最好封装一层适配逻辑,别裸用 name()

typeid 在多态对象上必须配合虚函数才能动态识别

如果类没有虚函数(即无虚表),typeid 对指针或引用永远返回静态类型,而不是实际对象类型。这是最容易被忽略的前提条件。

  • 哪怕子类重写了函数,只要基类没至少一个虚函数(包括虚析构),typeid(*ptr) 就不会“看穿”指针真实指向的子类
  • 典型错误:把 Base* 指向 Derived 实例,却期望 typeid(*ptr).name() 返回 Derived 的名字——不加虚函数就做不到
  • 最小代价:给基类加个虚析构函数 virtual ~Base() = default;,就能激活 RTTI 的动态行为

std::type_info::hash_code() 是唯一可移植的类型标识方式

比起不可靠的 name(),typeid(T).hash_code() 是标准规定的稳定值,同一程序中相同类型一定相等,不同类型大概率不等,适合做类型 ID 缓存或 switch 分支。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 比字符串比较快,无内存分配、无解码开销
  • 不能跨进程/跨 DLL 使用(哈希值不保证全局一致),但本进程内绝对可靠
  • 可用于 unordered_map 的 key:比如 std::unordered_map<:size_t std::any> type_registry;</:size_t>,key 用 typeid(X).hash_code()

开启 RTTI 是 typeid 正常工作的前提

某些嵌入式或性能敏感项目会用 -fno-rtti 关闭运行时类型信息,此时所有 typeid 表达式都会编译失败(GCC/Clang 报错 ‘typeid’ used on polymorphic type ‘X’ with /RTTI- disabled)。

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

  • 检查编译选项:CMake 中确认没设 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")
  • MSVC 对应开关是 /GR-,要确保是 /GR(默认开启)
  • 关了 RTTI 后,不仅 typeid 不可用,dynamic_cast 也会失效——这两者是一体的机制

类型名称这件事,本质是编译器和 ABI 协作的结果,不是语言层的“字符串反射”。真正稳定可用的只有 hash_code(),其余都得绕着 mangling 和虚表走。别指望靠 name() 做类型判断逻辑,尤其在发版前没在目标平台上实测解码结果的话。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6164

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3104

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

1812

2025.10.17

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

1071

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

1417

2024.03.13

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

355

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

355

2025.11.27

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1798

2023.08.03

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn