在揭开typeid神秘面纱之前,我们先来了解一下RTTI(Run-Time Type Identification,运行时类型识别),它使程序能够获取由基指针或引用所指向的对象的实际派生类型,即允许“用指向基类的指针或引用来操作对象”的程序能够获取到“这些指针或引用所指对象”的实际派生类型。在C++中,为了支持RTTI提供了两个操作符:dynamic_cast和typeid。
dynamic_cast允许运行时刻进行类型转换,从而使程序能够在一个类层次结构中安全地转化类型,与之相对应的还有一个非安全的转换操作符static_cast,因为这不是本文的讨论重点,所以这里不再详述,感兴趣的可以自行查阅资料。下面就开始今天我们的话题:typeid。

typeid是C++的关键字之一,等同于sizeof这类的操作符。typeid操作符的返回结果是名为type_info的标准库类型的对象的引用(在头文件typeinfo中定义)。
如果表达式的类型是类类型且至少包含有一个虚函数,则typeid操作符返回表达式的动态类型,需要在运行时计算;否则,typeid操作符返回表达式的静态类型,在编译时就可以计算。

type_info类提供了public虚 析构函数,以使用户能够用其作为基类。它的默认构造函数和拷贝构造函数及赋值操作符都定义为private,所以不能定义或复制type_info类型的对象。程序中创建type_info对象的唯一方法是使用typeid操作符(由此可见,如果把typeid看作函数的话,其应该是type_info的 友元)。type_info的name成员函数返回C-style的字符串,用来表示相应的类型名,但务必注意这个返回的类型名与程序中使用的相应类型名并不一定一致(往往如此,见后面的程序),这具体由编译器的实现所决定的,标准只要求实现为每个类型返回唯一的字符串。

#include <iostream>
using namespace std;class Base {virtual void f(){};
};
class Derived: public Base {};int main()
{Base b, *pb;pb = NULL;Derived d;cout << typeid(int).name() << endl<< typeid(unsigned).name() << endl<< typeid(long).name() << endl<< typeid(unsigned long).name() << endl<< typeid(char).name() << endl<< typeid(unsigned char).name() << endl<< typeid(float).name() << endl<< typeid(double).name() << endl<< typeid(string).name() << endl<< typeid(Base).name() << endl<< typeid(b).name()<<endl<< typeid(pb).name()<<endl<< typeid(Derived).name() << endl<< typeid(d).name()<<endl<< typeid(type_info).name() << endl;Base *pb2 = dynamic_cast<Base *>(new Derived);Base &b2 = d;Base *pb3 = &d;cout<<"hello"<<endl;cout << typeid(pb2).name() <<endl//输出P4Base<< typeid(b2).name()<<endl //输出7Derived<< typeid(pb3).name()<<endl//输出P4Base<< typeid(*pb3).name()<<endl;//输出7Derivedcout<< typeid(7.84).name() <<endl  //输出d<< typeid(Base*).name() <<endl //输出P4Base<< typeid(&pb3).name() <<endl; //输出:PP4Basereturn 0;
}

输出:

i
j
l
m
c
h
f
d
NSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE
4Base
4Base
P4Base
7Derived
7Derived
St9type_info
dynamic:
P4Base
7Derived
P4Base
7Derived
d
P4Base
PP4Base

c++ typeid函数相关推荐

  1. rtti是什么java_RTTI

    RTTI(Run-Time Type Identification),通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型. 中文名 运行时类型识别 外文名 Ru ...

  2. (转)C++的 RTTI 概念和用途

    自从1993年Bjarne Stroustrup [注1 ]提出有关C++ 的RTTI功能之建议﹐以及C++的异常处理(exception handling)需要RTTI:最近新推出的C++ 或多或少 ...

  3. RTTI-运行时类型识别

    RTTI 编辑 RTTI(Run-Time Type Information),通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型. 中文名 RTTI 外文名 ...

  4. java 泛化_Java语言class类用法及泛化(详解)

    这篇文章主要介绍了Java语言class类用法及泛化(详解),大家都知道Java程序在运行过程中,对所有的对象进行类型标识,也就是RTTI.这项信息记录了每个对象所属的类.虚拟机通常使用运行时类型信息 ...

  5. Class类和Object类及用法(一)

    Java中Class类及用法 Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识,即所谓的RTTI. 这项信息纪录了每个对象所属的类.虚拟机通常使用运行时类型信息选准正确 ...

  6. C++ Primer Plus学习(十四)——友元、异常和其他

    友元.异常和其他 友元 嵌套类 异常 RTTI 类型转换运算符 友元 友元 在C++中,一个类可以有public.protected.private三种属性的成员,通过对象可以访问public成员,只 ...

  7. C++11新特性——总结

    1. 列表初始化的使用 在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定.比如: struct Point {int _x;int _y; }; int main() ...

  8. Learning C++ No.14【STL No.4】

    引言: 北京时间:2023/3/9/12:58,下午两点有课,现在先把引言给搞定,这样就能激励我更早的把这篇博客给写完了,万事开头难这句话还是很有道理的,刚好利用现在昏昏欲睡的时候,把这个没什么干货的 ...

  9. C++如何限制模板类的类型

    或者说,C++如何限制泛型的参数类型? 在使用泛型编程时,有时候会有类似需求:要求T只能为某个类,或某几个类,那应该如何实现?据我所知有3中: 使用模板函数: 使用typeid函数(不推荐,因为其基于 ...

最新文章

  1. 说一下StoreBoard和纯代码编程各有什么好处吧
  2. TOJ5398: 签到大富翁(简单模拟) and TOJ 5395: 大于中值的边界元素(数组的应用)...
  3. dataframe 添加一行_R语言Data Frame数据框常用操作
  4. OpenShift Security (3) - 准备客户端环境和演示应用
  5. g++: command not found
  6. vb.net使用DirectX入门知识
  7. Pytorch模型量化介绍
  8. 新萝卜家园 GhostXP SP3 电脑城装机版 V2011.07
  9. 什么是SSR(服务器渲染)
  10. 决定Java程序员工资高低的三个因素
  11. [Markdown编辑器推荐] - 这个MarkText有点东西啊
  12. TIA博途V17中如何创建和使用VoT应用程序_Web功能
  13. Hive经典面试题——级联求和(访客访问统计报表)
  14. 《世界是数字的》读书笔记第一部分_硬件篇
  15. 关于ros中pcl_ros和ros链接问题Makefile:140的一种解决方案
  16. N4中Obix服务端
  17. 【反编译系列】反编译so文件(IDA_Pro)
  18. summernote支持视频上传功能,综合几个版本亲测可用
  19. html 名词解释 综合解释,HTML和JAVASCRIPT综合练习题2014答案
  20. [翻译] effective go 之 Formatting Commentary

热门文章

  1. 热图pheatmap 热图3:热图行列分组信息注释
  2. 新手须知设计的法则 Mark
  3. Pitstop 教程 去水印
  4. uncaught referenceerror cryptojs is not defined
  5. Strtoul command
  6. abap 转换成字符串_SAP ABAP转换特殊字符乱码
  7. C语言开源代码网站收集
  8. 使用HTML语言和CSS开发商业站点_HTML基础
  9. CS-NL(CVPR2020) Cross-Scale Non-Local Attention and Exhaustive Self-Exemplars Mining
  10. 示波器操作界面之功能控制区