新闻中心
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& 引用,可用于比较类型或获取类型名称。
基本语法:
typeid(表达式)typeid(类型名)
示例代码:
#include <iostream>
#include <typeinfo>
<p>class Base {
public:
virtual ~Base() {} // 必须有虚函数才能对指针/引用正确识别派生类型
};</p><p>class Derived : public Base {};</p><p>int main() {
Base* ptr = new Derived;</p><pre class='brush:php;toolbar:false;'>// 使用 typeid 获取实际类型
std::cout << "指针声明类型: " << typeid(ptr).name() << std::endl;
std::cout << "所指对象实际类型: " << typeid(*ptr).name() << std::endl;
delete ptr;
return 0;}
小云雀
剪映出品的AI视频和图片创作助手
1949
查看详情
输出结果中的
name() 返回的是编译器编码后的字符串(如 GNU 中可能是 6Derived),可使用 c++filt 工具还原为可读名称。
使用 type_info 进行类型比较
最实用的功能是判断两个对象是否为同一类型:
Base* b1 = new Base;
Base* b2 = new Derived;
<p>if (typeid(<em>b1) == typeid(</em>b2)) {
std::cout << "类型相同" << std::endl;
} else {
std::cout << "类型不同" << std::endl; // 会输出这个
}</p>注意:必须解引用指针(*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<Derived*>(ptr);
if (d) {
std::cout << "成功转换为 Derived" << std::endl;
}
基本上就这些。typeid 是 RTTI 的核心工具之一,适用于调试、日志和类型检查场景,但要注意其限制和平台差异。合理使用能提升程序的灵活性和健壮性。
以上就是c++++怎么在运行时获取一个类的类型信息RTTI_c++运行时类型识别与typeid用法的详细内容,更多请关注其它相关文章!
# 工具
# 编码
# 适用于
# 多态
# 的是
# 递归
# 如何使用
# stream
# ios
# c++
# ai
# 南山建设网站制作
# 童车产品营销推广
# 外链推广网站推荐
# 专业网站建设管理文案
# 网站页面优化实验
# 网站怎么在360优化
# 网站建设推广认可o火18星
# 网站优化工作方面的论文
# 受欢迎的福州seo服务
# 刷手机seo关键词排名
# 相关文章
# 推荐使用
# 但在
# 头文件
# 是一个
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Win11蓝牙耳机断连怎么解决 Win11蓝牙设置重新配对与驱动更新【技巧】
Win11 USB传输速度慢怎么解决 Win11 USB驱动更新与设置
58动漫网在线官方网 58动漫网正版动漫入口网址
支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样
Angular响应式表单:实现提交后表单及按钮的禁用与只读化
优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率
写好的html代码怎么运行出来_运行写好的html代码方法【教程】
sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统
如何在CSS中使用visited与link控制链接颜色_visited link伪类配合
必由学在线入口 必由学网页版快速登录入口
composer的"require-dev"部分是用来做什么的?
深入理解J*a链表中的IPosition接口与使用
c++项目目录结构应该如何组织_c++工程化项目结构规范
J*aScript设计模式实践_j*ascript代码优化
CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题
c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析
2306选座时如何选靠窗位置_12306选座靠窗座位查看方法解析
J*aScript异步迭代器_j*ascript异步遍历
QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台
如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】
Win11怎么修改默认浏览器_Windows 11设置Chrome为默认
漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端
css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异
如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构
如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化
理解Python模块与全局变量的作用域管理
抖音极速版最新版本 抖音极速版官方下载地址
c++ 命名空间怎么用 c++ namespace使用指南
印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】
C++如何比较两个字符串_C++ string compare函数与操作符对比
极兔快递快件信息查询系统 极兔快递官网运单号追踪
如何使用Go和Martini动态服务解码后的图片
苹果手机指南针不准怎么校准 传感器校准方法详解【建议收藏】
Mac怎么查看崩溃日志_Mac控制台错误报告分析
使用 Pandas 高效处理 .dat 文件:字符清理与数据计算
12306选座如何查看座位示意图_12306座位示意图解读与使用
J*aScript DOM操作:高效清空列表元素的策略与实践
小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口
AO3官方可用镜像 Archive of Our Own网页版最新入口
TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法
Go语言中高效处理x-www-form-urlencoded表单数据
将HTML Canvas内容转换为可上传的图像文件(File对象)
拷贝漫画电脑版官网入口 拷贝漫画(PC版)在线直达
抖音从哪里进入网页版_抖音官方入口链接
PHP中SSG-WSG API的AES加密实践:正确使用初始化向量
想当下一个《2077》?《心之眼》Steam评价升至"多半好评"
win11怎么查看应用耗电情况 Win11电池设置查看应用能耗排行榜【优化】
CSS布局中意外空白:解决padding-top导致的顶部间距问题
Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧
C++如何实现异步操作_C++11使用std::future和std::async进行异步编程


2025-11-19
浏览次数:次
返回列表