c++typeid()的使用

用处:

typeid()函数主要用来获取对应类型或者变量的类型信息,其返回一个std::type_info的对象,这个对象中存放了对应类型的具体信息。

所以typeid()函数就是获取一个type_info的类型,然后可以通过此类型来获取到相应的类型信息。

type_info的声明 

class type_info {
public:virtual ~type_info();bool operator==(const type_info& rhs) const;bool operator!=(const type_info& rhs) const;bool before(const type_info& rhs) const;const char* name() const;private:// 私有构造函数、复制构造函数和赋值运算符,以防止直接创建和复制type_info(const type_info&);type_info& operator=(const type_info&);
};

 这个类中你会发现内部有包含很多关于类型信息的操作函数。
 1. name();  // 可以获取到对应类型信息的名字。

 2. 重载了比较运算符,可以对获取到的类型信息进行比较。

 3. 主要的是,其赋值构造函数和有参构造函数,都设置为了私有的,在别的编译器实现可能会使用=delete删除掉,也就意味着我们没有办法使用type_info类定义对象,所以只有使用typeid才能够获取type_info类型的对象,来获取对应的信息。
 

注意:   type_info类型和typeid的实现是基于编译器的,也就是说c++只是提出了基于语法的层面,对于具体的实现不同的编译器是不一样的,但是用法都是类似的。

typeid的具体使用: 

首先说明,typeid的实现一般是基于虚函数的,当然是我们自己定义的类型,所以建议都使用虚函数。


原因是因为,基于c++的多态,虚函数会保存一个虚函数表的指针,虚函数表中会存储一个type_info的类型信息,但是至于存储在哪个位置,这是由编译器决定的,不同的编译器不一样,我们实际使用的时候没有必要关心。typeid就是借助虚函数表的机制可以判断出多态下父类指针指向的具体实际类型。

具体其实如何得知的,我猜测,应该是当父类的指针指向子类对象实现多态的时候,其对应父类的type_info信息的类型就会修改为其指向的子类类型。(不一定正确)

其实原因就是在多态的实现过程中,可以获取到对应指针指向的实际类型。

 定义一下三个类进行测试:

class People {
public:People() = default;virtual void write() {std::cout << "People\n";}
};class Man : public People {
public:Man() = default;virtual void write() override {std::cout << "Man\n";}
};class Woman : public People {
public:Woman() = default;virtual void write() override {std::cout << "Woman\n";}
};int main(void) {People* p1 = new People;Man* m1 = new Man;People* p2 = m1;    // 使用多态std::cout << typeid(p1).name() << std::endl;  // class People*std::cout << typeid(m1).name() << std::endl;  // class Man*std::cout << typeid(p2).name() << std::endl;  // class People*std::cout << typeid(*p2).name() << std::endl;  // class Manreturn 0;
}

对应的输出结果已经在函数调用之后了,记住typeid函数返回一个type_info类型的对象,但是我们不能使用这样的类型去接收,因为外部不可定义其对象,所以获取type_info类型只有通过typeid,所以获取之后直接使用这个对象。

代码中调用name()获取具体对象的类型。

仔细看最后一个打印信息,p2是一个父类指针对象,所以其类型是父类指针类型,但是*p2则不一样,由于多态的实现,*p2就是p2指针实际指向的类型,此处为Man类型,所以我们使用typeid检测之后得到的就是Man类型的数据。

也可以用于一般类型: 

std::cout << typeid(int) << std::endl;  // int

类型进行比较

if(typeid(int) == typeif(float)){}else{}

 我们可以直接使用==比较两个类型是否相同,相同执行一个分支否则执行另外一个分支,实现运行时类型检查,不同的类型情况进行不用的代码。

dynamic_cast借助typeid进行运行时类型检测 

dynamic_cast是c++新增的类型强制转换,其主要用于继承系列的类型转换,成功返回转换后的指针,失败返回NULL。


其就是根据typeid获取对应的变量的实际类型,然后根据继承树来判断是否可以转换,子类转父类没问题,父类转子类会返回NULL。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/51905.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RxJava基础使用

Rx思想 事件从起点流向终点。 过程中可以对事件进行拦截&#xff0c;拦截时可以对事件进行处理&#xff0c;处理后将处理后的事件继续流向终点。 终点接收上一次处理后的事件。 获取网络图片并显示 基础实现 使用Observable.just(path) 创建图片路径的Observable。 使用m…

Unity | Shader基础知识(第二十集:应用-简易流光、LOD)

目录 一、前言 二、LOD 1.什么是LOD 2.代码如何调节LOD 三、流光 1.资源准备 2.uv移动 3.获取图片中的uv 4.改变uv去取流光的颜色&#xff08;时间的应用&#xff09; 5.图片叠加 6.透明图片的叠加 四、纯净代码 五、作者的碎碎念 一、前言 有小伙伴问&#xf…

Studying-代码随想录训练营day45| 115.不同的子序列、583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇

第45天&#xff0c;子序列part03&#xff0c;编辑距离&#x1f4aa;(ง •_•)ง&#xff0c;编程语言&#xff1a;C 目录 115.不同的子序列 583. 两个字符串的删除操作 72. 编辑距离 编辑距离总结篇 115.不同的子序列 文档讲解&#xff1a;代码随想录不同的子序列 视频讲…

分布式搜索引擎ES--Elasticsearch集群

1.Elasticsearch集群的概念 分片机制&#xff1a;每个索引都可以被分片 索引my_doc只有一个主分片&#xff1b;索引shop有三个主分片&#xff1b;索引shop2有5个主分片;(参考前面案例) 每个主分片都包含索引的数据&#xff0c;由于目前是单机&#xff0c;所以副分片是没有的&a…

安全开发第一篇

文章目录 参与RASP、IAST等安全防护工具的开发技术背景开发流程技术挑战工具和资源示例结论 以phpstudydvwa为列 实现 SQL 注入检测脚本 参与RASP、IAST等安全防护工具的开发 参与 RASP&#xff08;Runtime Application Self-Protection&#xff09;和 IAST&#xff08;Intera…

为开源奉献一份自己的力量:Cesium没有热力图组件,我们自己封装!

大家好&#xff0c;我是日拱一卒的攻城师不浪&#xff0c;专注可视化、数字孪生、前端提效、nodejs、AI学习、GIS等学习沉淀&#xff0c;这是2024年输出的第27/100篇文章。 交流合作&#xff1a;brown_7778 前言 热力图&#xff0c;在很多可视化场景开发中会被经常提到&#x…

构建无懈可击的反射API安全防线

构建无懈可击的反射API安全防线是一个综合性的任务&#xff0c;需要从多个方面入手&#xff0c;包括输入验证、权限控制、代码封装、日志记录、错误处理以及持续的安全审计等。以下是一个详细的构建步骤&#xff0c;并包含示例代码&#xff08;以Java为例&#xff09;&#xff…

ElasticSearch 关于搜索,有哪些类型的搜索

在Elasticsearch中&#xff0c;根据不同的需求和场景&#xff0c;有多种类型的搜索可供使用。下面是几种常见的搜索类型及其应用场景&#xff1a; 1. 全文搜索 (Full-text Search) 描述&#xff1a;全文搜索是最常用的搜索类型&#xff0c;它允许用户在文档中搜索特定的单词或…

electron 主进程和渲染进程

最近在整理electron 相关的项目问题&#xff0c;对自己来说也是温故知新&#xff0c;也希望能对小伙伴们有所帮助&#xff0c;大家共同努力共同进步。加油&#xff01;&#xff01;&#xff01;&#xff01; 虽然最近一年前端大环境不好&#xff0c;但是大家还是要加油鸭&#…

网安零基础入门神书,全面介绍Web渗透核心攻击与防御方式!

Web安全是指Web服务程序的漏洞&#xff0c;通常涵盖Web漏洞、操作系统洞、数据库漏洞、中间件漏洞等。 “渗透测试”作为主动防御的一种关键手段&#xff0c;对评估网络系统安全防护及措施至关重要&#xff0c;因为只有发现问题才能及时终止并预防潜在的安全风险。 根据网络安…

【Qt开发】No matching signal for on_toolButton_clicked() 解决方案

【Qt开发】No matching signal for on_toolButton_clicked() 解决方案 文章目录 No matching signal for xxx 解决方案附录&#xff1a;C语言到C的入门知识点&#xff08;主要适用于C语言精通到Qt的C开发入门&#xff09;C语言与C的不同C中写C语言代码C语言到C的知识点Qt开发中…

Linux安装青龙面板并将本地服务映射至公网实现远程访问

文章目录 前言一、前期准备本教程环境为&#xff1a;Centos7&#xff0c;可以跑Docker的系统都可以使用。本教程使用Docker部署青龙&#xff0c;如何安装Docker详见&#xff1a; 二、安装青龙面板三、映射本地部署的青龙面板至公网四、使用固定公网地址访问本地部署的青龙面板 …

全局异常 @ControllerAdvice 该怎么写

本文首发于稀土掘金&#xff1a;全局异常 ControllerAdvice 该怎么写&#xff0c;该账号即为本人账号&#xff0c;非搬运。 问题由来 很多小伙伴刚进公司做项目的时候&#xff0c;会看到项目里面有一个ControllerAdvice标记的类&#xff0c;整个类的编码结构大概是这样子&…

程序员极力推荐的几款插件

前言 h之前分享程序员喜欢的神器之后&#xff0c;还是相当多的伙伴喜欢&#xff0c;那一期的工具不仅是协助你工作还是工作外摸鱼划水&#xff0c;体验感是相当不错的。 这一期我还是打算把我非常喜欢用的几款插件分享给大家&#xff0c;这几款差劲不仅帮助我节省很多时间&am…

2024年软件系统与信息处理国际会议(ICSSIP 2024)即将召开!

2024年软件系统与信息处理国际会议&#xff08;ICSSIP 2024&#xff09;将于2024年10月25-27日在中国昆明举行。引领技术前沿&#xff0c;共谋创新未来。ICSSIP 2024将汇聚来自世界各地的专家学者&#xff0c;他们将在会上分享最新的研究成果、技术突破及实践经验。会议议题涵盖…

WAAP替代传统WAF已成趋势

数字化时代&#xff0c;Web应用和API已成为企业运营的核心。然而&#xff0c;随着网络攻击手段的不断进化&#xff0c;自动化攻击愈发频繁&#xff0c;传统的Web应用防火墙&#xff08;WAF&#xff09;已难以满足现代企业的安全需求。WAAP&#xff08;Web Application and API …

我出一道面试题,看看你能拿 3k 还是 30k!

大家好&#xff0c;我是程序员鱼皮。欢迎屏幕前的各位来到今天的模拟面试现场&#xff0c;接下来我会出一道经典的后端面试题&#xff0c;你只需要进行 4 个简单的选择&#xff0c;就能判断出来你的水平是新手&#xff08;3k&#xff09;、初级&#xff08;10k&#xff09;、中…

大镜山阿里巴巴国际站数据采集软件使用方法|阿里国际站商家信息采集软件使用方法|阿里国际站信息采集软件使用方法

大镜山阿里巴巴国际站数据采集软件一款采集阿里巴巴国际站alibaba.com商家数据的软件&#xff0c;采集的数据包括店铺名称、店铺年份、评分、邮件地址、手机号码、网址及社交连接等。 下载大镜山阿里巴巴国际站数据采集软件 大镜山阿里巴巴国际站数据采集软件下载地址 大镜山…

基于STM32设计的智能窗户控制系统(华为云IOT)(196)

文章目录 一、设计需求1.1 设计需求总结1.2 整体设计思路1.3 整体构架1.4 功能总结1.5 ESP8266模块配置1.6 上位机开发思路1.7 项目的意义1.8 供电方式1.9 参考文献1.10 整体框架1.11 设备原理图二、硬件选型2.1 ESP8266-串口WIFI2.2 STM32开发板2.3 USB下载线2.4 洞洞板2.5 雨…

掌握Linux:常用命令及实用技巧

掌握Linux&#xff1a;常用命令及实用技巧 Linux&#xff0c;一个强大而灵活的操作系统&#xff0c;它不仅驱动着全球大部分的服务器和超级计算机&#xff0c;也是许多开发者和极客的首选平台。然而&#xff0c;对于初学者来说&#xff0c;Linux的命令行界面可能显得有些陌生和…