1. 运行阶段类型识别(RTTI)

RTTI是运行阶段类型识别的简称,它为程序在运行阶段确定对象的类型提供了一种标准方式。组要注意的是,他们只适用于包含虚函数的对象。

RTTI主要包含三个元素:dynamic_cast,typeid和typeinfo

(1) dynamic_cast

该操作符将使用一个指向基类的指针来生成一个派生类的指针;如果生成失败,则返回0—空指针。

dynamic_cast不能回答“指针指向的是哪类对象”,但能回答“是否可以安全地将对象的地址赋给特定的类型的指针”。举例:

1
2
3
4
5
class Grand{…};
class Superb: public Grand{…};
class Magnificent: public Superb {…};

假设有以下指针:

1
2
3
4
5
Grand *pg = new Grand;
Grand *ps = new Superb;
Grand *pm = new Magnificent;

对于以下转换:

1
2
3
4
5
Magnificent *p1 = (Magnificent *) pm;   //#1
Magnificent *p2 = (Magnificent *) pg;   //#2
Superb *p1 = (Magnificent *) pm;    //#3

哪些是安全的呢?很明显,#1和#3是安全的,#2是不安全的,因为派生类中可能存在基类中并没有的数据成员和函数。

怎样知道类型转换是否安全呢?可使用dynamic_cast,表达式为:dynamic_cast<Type *>(pt)

如:

1
Superb *pm = dynamic_cast<Superb *>(pg);

(2) typeid

返回一个指出对象类型的值。可用于判断两个对象是否为同类型。与sizeof类似,可接受两种参数:类名和结果为对象的表达式。

(3) type_info

typeid返回的是对type_info的引用。type_info重载了==和!=操作符,可使用这些操作符对类型进行比较,例如,如果pg指向的是一个Dog对象,则表达式:

typeid(Dog) == typeid(*pg) 的结果为bool值true。

2. 类型转换操作符

C语言中能够的类型转换操作符过于松散,如:

1
2
3
4
5
6
7
8
9
10
11
struct Data {double Data[200];};
struct Junk{int junk[200]};
Data d={2.5, 3.2,2.1};
char* pch = (char *)(&d);
char ch = char (&d);
Junk *pj = (Junk*)(&d);

上述转换中,哪些有意义?除非不讲理,否则任何一种均有意义。

对于这种松散情况,C++更为严格地限制允许的类型转换,并添加了4个类型转换操作符:dynamic_cast(前面已经介绍),const_cast,static_cast,reinterpret_cast。

(1)const_cast:去掉const和volatile标签,如:

1
2
3
4
5
const int a = 5;
const int* b = const_cast<int *>(&a);
*b = 6; //ok!!!

提供该操作符的原因是,有时候可能需要这样一个值,他在大部分情况下是常量,而有时又是可以修改的。

(2) static_cast: 使用:static_cast<type_name> (expression);

仅当type_name可被隐式转换为expression所属的类型或者expression可被隐式转换为type_name所属的类型时,上述转换才合法。

设High是Low的基类,而Pond是一个无关的类,则:

1
2
3
4
5
6
7
8
9
10
11
High high;
Low low;
……
High *pb = static_cast<High *>(&low); //valid
Low *pl = static_cast<Low *>(&high); //valid
Pond *pp = static_cast<Pond*>(&low); //invalid

static可用将整数转化为枚举类型,将枚举类型转化为整数类型,将double转为int,将float转为long等

(3) reinterpret_cast:用于天生危险的类型转换,有时程序员必须做一些依赖于实现的,令人生厌的操作。如:

1
2
3
4
5
6
7
struct dat {short a; short b;};
long value=0Xa224b118;
dat *pd = reinterpret_cast<dat *>(&value);
cout<<pd->a;

原创文章,转载请注明: 转载自董的博客

本文链接地址: http://dongxicheng.org/cpp/cpp-rtti/

《C++ Primer plus》学习笔记之”RTTI”相关推荐

  1. 整理:C primer plus 学习笔记

    前言:简单看了一遍C Primer Plus, 整理了一下,因为时间比较少,自己理解地比较肤浅,所以第一版比较简陋. 假期的时候应该会有时间再整理一下.------2018/11/5 2019/1/2 ...

  2. C++ Primer Plus 学习笔记(第 4 章 复合类型)

    C++ Primer Plus 学习笔记 第 4 章 复合类型 数组 数组(array)是一种数据格式,能够存储多个同类型的值. 要创建数组,可使用声明语句.数组声明应指出以下三点: 存储在每个元素的 ...

  3. C++ Primer Plus学习笔记之类和动态内存分配

    前言 个人觉得学习编程最有效的方法是阅读专业的书籍,通过阅读专业书籍可以构建更加系统化的知识体系. 一直以来都很想深入学习一下C++,将其作为自己的主力开发语言.现在为了完成自己这一直以来的心愿,准备 ...

  4. C++ Primer Plus学习笔记之函数探幽

    前言 个人觉得学习编程最有效的方法是阅读专业的书籍,通过阅读专业书籍可以构建更加系统化的知识体系. 一直以来都很想深入学习一下C++,将其作为自己的主力开发语言.现在为了完成自己这一直以来的心愿,准备 ...

  5. 《C++ Primer》学习笔记

    这次一定要完整学完 2022/8/24 像编辑器一样思考和理解C++ C++的编程风格:C风格.基于对象.面向对象.泛型和基于组件. 初学建议<C++Primer>和<C++标准程序 ...

  6. 090518-C++primer 4th学习笔记:1.3节

    1.3 C++程序的注释   注释是为了帮助其他人读懂你的程序.注释一般用来简要概述一个算法,标明一个变量的用途,或者解释一段不容易读懂的程序段.注释会在被编译器忽略,所以不会增加可执行程序的大小. ...

  7. 《C++Primer》学习笔记(6-10章)

    第六章 语句 1. if (int i = 3) // i转化成bool值true; 迄今为止,在所有用过的类型中,IO类型可以用作条件,vector和string类型一般不可用作条件 上面,出了if ...

  8. C++primer plus学习笔记

    第一章 预备知识 1.1 C++简介 C++融合了3种不同的编程方式: C语言代表的过程性语言 C++在C语言基础上添加的类代表面向对象语言 C++模型支持的泛型编程 C++继承C语言高效.简洁.快速 ...

  9. c++ primer plus 学习笔记

    我的机子用Xcode,单位是字节 0开头为8进制 0x为16进制 cout默认输出的是10进制 wchar_t 宽字节,它是一种足够大的整形类型,可以用来表示的是比如中文的编码 c常量一旦被定义,就不 ...

最新文章

  1. 计算机网络技术简答题,《计算机网络技术》简答题.doc
  2. CUDA、CUDA toolkit、CUDNN、NVCC关系
  3. mysql命令参数详解_详解Mysql命令大全(推荐)
  4. Python常用模块之subprocess模块
  5. EOJ Monthly 2019.2 (based on February Selection) D.进制转换
  6. MATLAB安装第三方工具箱
  7. 实时监听input输入框value的变化:
  8. Python3 爬虫学习笔记 C09【数据储存系列 — 文件储存】
  9. python 按条件选择行和列数据_小白学数据结构-排序算法Python(冒泡、选择、快速、希尔等等)...
  10. HTML5类选择器使用,CSS选择器种类及使用方法
  11. spark需要maven管理吗_使用Eclipse编写Spark应用程序(Scala+Maven)
  12. 如何从网页上下载页面嵌入的PDF文件
  13. GBT 31000-2015 社会治安综合治理基础数据规范 数据项 编码
  14. 【转】非教育网中IPv4网络访问IPv6资源
  15. messenger支持查找附近的人功能吗_您如何使用Facebook Messenger跟踪某人的位置 | MOS86...
  16. 《关键信息基础设施安全保护条例》来了!完善网络安全体系 华云数据构筑云上安全屏障
  17. Java程序设计 试卷A
  18. golang中如何比较struct,slice,map是否相等以及几种对比方法的区别
  19. idea windows找不到文件chrome
  20. 如何画一个精致的思维导图

热门文章

  1. 梯度下降和随机梯度下降为什么能下降?
  2. Spring Cloud【Finchley】实战-07异步下单
  3. json html显示中文乱码,后台请求json文件,中文出现乱码
  4. Go语言defer详解
  5. matlab生产计划问题,基于MATLAB的生产计划最优化系统设计
  6. java错误: 非法字符: '\ufeff' 需要class, interface或enum
  7. 如何正确运用计算机,如何正确使用电脑
  8. vuepress侧边栏配置_vuepress的侧边栏怎么动态生成
  9. python怎么选择安装位置图片_怎么下载官网python并安装
  10. java static 变量共享_java中如何理解多个对象共享同一个静态成员变量?