本文只讲述typeid这个操作符,呃  ,它确实是一个操作符,类似于 sizeof 操作符。

在将该操作符之前,不得不提的是RTTI(Run-Time Type Identification,运行时类型识别),其实就是说

在运行期得到对象的实际的类型。这立刻使我们想到了“可以通过基类的指针和引用可以指向实际的派生类型”

啊哦,答对了,这就是typeid这个强大操作符所做的事。

既然提到了typeid,那么该操作符的返回类型便不得不提,该操作符的返回类型是type_info的标准库类型的引

用 , 这是定义在标准库的一个类类型class type_info; 值得一提的是,该类的拷贝构造函数以及赋值操作符被定义

为private,这是禁止复制该类型的对象。

创建type_info对象的唯一方法,便是调用typeid操作符。

该类中最常用的成员函数name函数,该函数的返回类型是一个C风格的字符串,用于表示类型的id。

该函数同样是一个异常安全的函数,即不抛出异常。

当然了,对于在编译器与运行期类型一直的对象,typeid同样适用,比如内置类型:

例如下面的代码:

#include #include // typeid
using namespace std;
int main()
{
int iVal;
cout << typeid(iVal).name() << endl;
double dVal;
cout << typeid(dVal).name() << endl;
return 0;
}

上述代码用于获取 int  以及 double 的类型id:

注:在不同的编译器设置下,输出的结果可能不同。

在我的编译器下,输出的结果是:

那么,接下来进入typeid的真正意图,首先查看下面的代码:


#include #include using namespace std;
//类的定义不是我们的重点,因此假设为空
class Base {};
class Derived : public Base {};
int main()
{
//Base对象
Base b;
cout << "b type : " << typeid(b).name() << endl;
//Derived对象
Derived d;
cout << "d type : " << typeid(d).name() << endl;
//Base 指针
Base *pb = new Base();
cout << "pb type : " << typeid(pb).name() << endl;
//Base 指针指向Derived对象
Base *pd = new Derived() ;
cout << "pd type : " << typeid(pd).name() << endl;
cout << "*pd type : " <<< endl;
//Base引用Derived对象
Base &rd = d;
cout << "rd type : " << typeid(rd).name() << endl;
return 0;
}

相比看到这儿,读者应该会觉得生成的结果是什么了吧?那么不要对接下来的结果感到意外啦!!

上述代码的执行结果:

结果跟想象的怎么不一样!不对,是完全不一样,typeid是不是就是实现错了呢!!!

稍安勿躁,接下来,本文最重要的一句话:

当typeid操作符的操作数是不带有虚函数的类类型时,typeid操作符会指出操作数的类型,而不是底层对象的类型。

那么,这句话就很好的解释了上面的结果,至于typeid,那么我们可以很容易的改变上述代码,检验其正确性:

#include #include using namespace std;
class Base
{
public:
virtual ~Base(){}
};
class Derived : public Base {};
int main()
{
Base b;
cout << "b type : " << typeid(b).name() << endl;
Derived d;
cout << "d type : " << typeid(d).name() << endl;
Base *pb = new Base();
cout << "pb type : " << typeid(pb).name() << endl;
Base *pd = new Derived() ;
cout << "pd type : " << typeid(pd).name() << endl;
cout << "*pd type : " <<< endl;
Base &rd = d;
cout << "rd type : " << typeid(rd).name() << endl;
return 0;
}

添加了一个虚函数即可,得到的结果就如预期一般了:

这里,提醒一点:当你需要一个虚函数,但是该类中没有对应的函数需要派生类重定义的时候,那么 虚析构函

数 你绝对不能忘记,这是一个很好的选择!!!

关于typeid,上述基本已经介绍完毕,一个很强大的操作符。这里不禁会想到另一个操作符  dynamic_cast,其

实这不过是++的 RTTI 的两种策略罢了。

C++ 标准库之typeid相关推荐

  1. C++ - STL标准库

    1.C++ STL标准库简介 长久以来,软件界一直希望建立一种可重复利用的东西,以及一种得以制造出"可重复运用的东西" 的方法,从函数(functions),类别(classes) ...

  2. 【侯捷】C++STL标准库与泛型编程(第三讲)

    第三讲 算法的形式 C++标准库的算法,是什么东西? 说明: 算法Algorithm 是个 function template,标准库中的算法都长成如下这样: template<typename ...

  3. STL标准库及泛型编程

    1-认识headers.版本.重要资源 C++ Standard Library Standard Template Library 标准库 > STL 标准库以header files形式呈现 ...

  4. C++标准库(STL)与泛型编程

    C++标准库(STL)与泛型编程 学习网站: cplusplus.com cppRerference.com 学习书籍: <STL源码剖析> STL体系结构基础介绍 STL六大部件:容器. ...

  5. STL(C++标准库,体系结构及其内核分析)(STL源码剖析)(更新完毕)

    文章目录 介绍 Level 0:使用C++标准库 0 STL六大部件 0.1 六大部件之间的关系 0.2 复杂度 0.3 容器是前闭后开(左闭右开)区间 1 容器的结构与分类 1.1 使用容器Arra ...

  6. Go 学习笔记(78)— Go 标准库 net/http 创建服务端(接收 GET、POST 请求)

    使用 net/http 标准库创建一个 http 的 restful api 的服务端,用来处理 GET.POST 等请求. 源代码如下: package mainimport ("enco ...

  7. GCC 连接器、链接标准库 gcc -l、链接手动创建库(指定目录的库 gcc -L)

    1. 链接器 链接器把多个二进制的目标文件(object file)链接成一个单独的可执行文件. 在链接过程中,它必须把符号(变量名.函数名等一些列标识符)用对应的数据的内存地址(变量地址.函数地址等 ...

  8. Go 学习笔记(55)— Go 标准库 sql (初始化数据库、插入、更新、删除数据库表、单行查询、多行查询、事务处理)

    1. 标准库说明 Go 的标准库中是没有数据库驱动,只提供了驱动接口,有很多第三方实现了驱动,我们这里选择 go-sql-driver 这个实现是目前使用最多的.github 地址是:https:// ...

  9. Python 标准库之 subprocesss

    Python 目前已经废弃了 os.system.os.spawn*.os.popen*.popen2.*.commands.* 来执行其他语言的命令,取而代之的是 subprocess 模块. 运行 ...

最新文章

  1. linux怎样查看内核参数,Linux 实例如何查看和修改 Linux 实例内核参数?
  2. STM32 HAL库详解 及 手动移植
  3. zookeeper可视化工具zkui
  4. C#模拟MSN窗体抖动
  5. sun jdk 与jdk_Sun过去的世界中的JDK 11和代理
  6. 【hadoop各个节点的意思】
  7. 电磁场数值计算方法matlab,电磁场数值计算法与MATLAB实现
  8. PS磨皮—高低频磨皮
  9. Java工程师进阶,Java全栈知识体系
  10. Redis生成自增流水号,每日清零
  11. java数组初始化 new_java 数组初始化
  12. 一影碎念,一场风花,浅吟低唱成悲曲:伤感日志
  13. 第四章 DirectX 渲染流水线(上)
  14. 小程序分包加载不同项目字体图标引用问题
  15. mysql分页语句解释,mysql语句分页limit什么意思
  16. NC WebService开发参考
  17. 终于搞定美团app人气榜提取的数据分类工作
  18. android 新闻应用、Xposed模块、酷炫的加载动画、下载模块、九宫格控件等源码... 1
  19. 勇者斗恶龙UVa 11292
  20. 【opencv学习】opencv基础用法

热门文章

  1. Java操作Excel 并 保存新Excel
  2. 安装Centos 7系统
  3. 【Maven】高级应用:私服(nexus)搭建及使用、自定义项目骨架(archtype)
  4. nexus私服安装包
  5. 教育培训python
  6. SecureCRT教程——如何使用SecureCRT命令窗口将命令发送到多个会话
  7. 2021-06-22 19点30 程序外生活 - 中国A50指数 机器预测学习跟踪记录 - 周2白天反弹持续进行,量能不高但平稳,持续反弹概率大,等待顶部信号出现再反向交易,暂多。但周月线持续跌势。
  8. Bert使用之一_基本使用
  9. 使用蓝桥杯单片机实现ADC采集和实时时钟界面转换与报警功能
  10. DELPHI BULK INSERT