C++ TypeId简介与使用

  • 简介

TypeId 返回一个变量或数据类型的“类型”。

  • 使用场景

用法如下:

    cout<<typeid(int).name()<<endl;    
    int a;
    cout<<typeid(a).name()<<endl;

输出如下:

int

int

  • 注意事项

如果有类A,且有虚函数,类B,C,D都是从类A派生的,且都重定义了类A中的虚函数,这时有类A的指针p,再把对象类B的对象的地址赋给指针p,则typeid(p).name()将返回的类型将是A*, 因为这里的p表示的是一个指针,该指针是类型为A的指针, 所以返回A*, 而typeid(*p).name()将返回B,因为指针p是指向类B的对象的,而*p就表示的是类B的对象的类型,所以返回B。

比如有类 A,其中定义有虚函数,而类B,C,D都是从类A派生而来的且重定义了该虚函数,这时有个类A的指针p和p1,按照虚函数的原理,基类的指针可以指向任何派生类的对象,在这时就有可能需要比较两个指针是否指向同一个对象,这时就可以这样使用typeid了,typeid(*p)= =typeid(*p1);这里要注意的是typeid(*p)与typeid(p)是指的不同的对象类型,typeid(p)表示的是p的类型,在这里p是一个指针,这个指针指向的是类A的对象,所以p的类型是A*, 而typeid(*p)则不一样, *p表示的是指针p实际所指的对象的类型, 比如这里的指针p指向派生类B,则typeid(*p)的类型为B。所以在测试两个指针的类型是否是相等时应使用*p,即typeid(*p)= =typeid(*p1)。如果是typeid(p)= =typeid(p1)的话,则无论指针p和p1指向的什么派生类对象,他们都是相等的,因为都是A *的类型。

  • 相关文献和资料

关于typeid的错误(warning C4541: ‘typeid‘ used on polymorphic type ‘class A‘ with /GR-; unpredictable behavior may result):

解决方法:在vc6中. Project - settings... - C/C++ ,在Category那里选 C++ Language,再在下边勾上 Enable Run-Time Type Information[RTTI]。这样再运行程序的时候就不会有错误了。

RTTI(运行时类型信息)会带来额外的开销,大部分编译器都支持RTTI,但在默认情况下关闭此功能,需要用上面的方法打开RTTI开关。

时间: 2024-10-01 07:22:45

C++ TypeId简介与使用的相关文章

C++重载运算简介

本文基于<C++ Primer(第5版)>中14章和<More Effective C++>条款7,整理而成. 其实写这篇博客之前,内心还是很忐忑的,因为,博主的水平很有限,视野比较窄,要是在理解书的过程中有了偏差,给读到这篇博客的人以错误的认识,那罪过就大了.再次声明本文仅是简介,若是有错误的地方欢迎留言指出. 个人认为运算符最重要的是:使用与内置类型一致的含义. 一.基本概念 当运算作用于类类型的运算对象时,可以通过运算符重载重新定义该运算符的含义. 重载的运算符是具有特别名字

【C/C++学院】0822-类型转换函数与构造转换函数/类的继承/类的继承以及区别/继承静态成员与静态函数//继承实现代码重用/单继承QT案例/多继承简介以及实战/Gpu编程

类型转换函数与构造转换函数 #include<iostream> class fushu { public: explicit fushu(int num)//避免隐式转换,引发歧义 { x = num; y = num; } void print() { std::cout << x << "+" << y << "i" << std::endl; } operator int(); //不支

织梦dedecms 中怎么在首页调用指定单篇文章的body主体内容和简介?

在使用织梦dede建站的过程中,我们通常会在首页或者列表页调用文章内容,官方的做法一 般是调用描述内容,但是调用描述存在相应的缺点:调用的内容有限,默认描述内容较短,并且文章修改后,描述不能自动修改,需要手动修改.下面分享一个可以 实现首页或者列表页调用文章body内容而不是description的方法: {dede:arclist row='1' addfields='body' idlist='18' typeid='1' channelid='1'} [field:body functio

dedecms程序核心程序和数据库目录及简介

1.程序核心程序目录及简介/include目录 程序核心目录config_base.php 环境定义文件.用于检测系统环境,定义工作目录,保存数据库链接信息,引入常用函数等,建议不要修改.config_hand.php 系统配置文件.定义系统常用的配置信息定义,可从后台管理直接生成该文件.config_passport.php 通行证文件config_rglobals.php 检测系统外部变量config_rglobals_magic.php 同上inc_archives_view.php 用于

C++11简介(1)

原文地址:http://www.codeproject.com/Articles/312029/Cplusplus-A-Glance-part-of-n 1.介绍 C++0x现在是一个正式标准了,被称作C++11.ISO C++在2011年正式通过这个标准.这篇文章的目的是浏览C++11的特性和介绍VS2010中支持的特性,且可以作为你研究个别特性的一个开端. 因为长度原因,文章被分为了几部分.我自己也十分害怕一次性阅读那么长的文档,再说一次把C++11特性写完将会是工作变得无聊. 这是我在co

Android网络通讯简介

网络通信应该包含三部分的内容:发送方.接收方.协议栈.发送方和接收方是参与通信的主体,协议栈是发送方和接收方进行通信的契约.按照服务类型,网络通信可分为面向连接和无连接的方式.面向连接是在通信前建立通信链路,而通信结束后释放该链路.无连接的方式则不需要在通信前建立通信连接,这种方式不保证传输的质量. Android提供了多种网络通信的方式,如Java中提供的网络编程,在Android中都提供了支持.Android中常用的网络编程方式如下: 针对TCP/IP协议的Socket和ServerSock

微信红包的架构设计简介

@来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈咨询微信红包的架构,于是乎有了下面的文字(有误请提出,谢谢) 概况:2014年微信红包使用数据库硬抗整个流量,2015年使用cache抗流量. 微信的金额什么时候算? 答:微信金额是拆的时候实时算出来,不是预先分配的,采用的是纯内存计算,不需要预算空间存储.. 采取实时计算金额的考虑:预算需要占存储,实时效率很高,预算才效率低. 实时性:为什么明明抢到红包,点开后发现没有? 答:2014年的红包一点开就知道金额,分两次操作

JSON 简介

ylbtech-JSON: JSON 简介 JSON:JavaScript Object Notation(JavaScript 对象表示法) JSON是存储和交换文本信息的语法,类似 XML. JSON 比 XML 更小.更快.更易解析. JSON 实例 { "employee":[ {"firstName":"John","lastName":"Doe"}, {"firstName"

Docker简介

Docker简介 什么是Docker: 正所谓Docker的英文本意为"搬运工",所以在我们的世界里,可以理解为Docker搬运的是装满任意类型的APP的集装箱,开发者可以通过Docker将APP变成一种标准化的.可移动植的.自动管理的组件.它用一种新的方式实现了轻量级的虚拟机,专业术语成为应用容器(Application Container) Docker的优势: 1.利用率高 ·Docker对系统资源的利用率很高,一台主机可以同时运行数千个Docker容器 2.可以快速的交付应用程