前言
在分析typeid
之前, 先了解什么是RTTI(运行时类型识别). RTTI使程序能够获取由基指针(引用)所指向的对象的实际派生类型, 允许用指向基类的指针(引用)来操作对象并能够获取到这些指针(引用)所指对象的实际派生类型. c++具体支持typeid
和dynamic_cast
两个操作符.
而typeid
操作符用于返回对象的引用, 实际调用的是type_info
标准库类型, 也在typeinfo
头文件中. 并且typeid
有两种形式, 一种在编译期获得类型, 一种在运行时通过RTTI获取类型.
注意 : typeid
的类中的默认构造函数和复制构造函数都是被删除的, 所以typeid
对象不能执行复制操作, 只能单独创建对象.
typeid支持的操作
运算 | 描述 |
---|---|
t1 == t2 | 如果两个对象t1和t2类型相同,则返回true;否则返回false |
t1 != t2 | 如果两个对象t1和t2类型不同,则返回true;否则返回false |
t.name() | 返回类型的C-style字符串,类型名字由编译器相关的方法产生 |
t1.before(t2) | 返回指出t1是否出现在t2之前的bool值 |
typeid.name()
产生的对象名是由编译器决定的, 所以不同的编译器可能产生的名字并不一样.
typeid形式
typeid
有两种形式, 一种在编译期获得类型, 一种在运行时通过RTTI获取类型.
我们先分析编译期就能获得类型, 再分析RTTI获取类型.
编译期获得类型
只要不涉及虚表并且没有基类指针(引用)指向子类的情况都是能在编译期间就可以获得类型的信息.
先来看一下在g++编译器中的基本类型名是什么.
cout << typeid(char).name() << endl; // c
cout << typeid(short).name() << endl; // s
cout << typeid