1. 运行时类型识别(run-time type identification )

当我们将这两个运算符用于某种类型的指针或引用, 并且该类型含有虚函数时, 运算符将
使用指针或引用所绑定对象的动态类型

  • typeid 运算符, 用于返回表达式的类型。
  • dynamic_cast 运算符, 用于将基类的指针或引用安全地转换成派生类的指针或引用

2 dynamic_cast运算符 :

type类型必须时一个类类型,并且通常情况下该类型应该含有虚函数。

dynamic_cast<type*>(e)  // e必须是一个有效的指针
dynamic_cast<type&>(e)  // e必须是一个左值
dynamic_cast<type&&>(e) // e不能是左值

2.1 e的类型要求

必须符合三个条件中的任意一个,它们是:

  • e的类型是目标type的公有派生类;
  • e的类型是目标type的共有基类;
  • e的类型就是目标type的类型;

如果一条 dynamic_cast 语句的转换目标是指针类型并且失败了, 则结果为 0。 如果转换目标是引用类型且失畋了,dynamic_cast 运算符将抛出一个 bad_cast 异常

可以对一个空指针执行dynamic_cast,结果是所需类型的空指针

2.2 指针类型的 dynamic_cast

// 指针类型的dynamic_cast
// 假设Base类至少含有一个虚函数,Derived是Base的共有派生类。
if (Derived *dp = dynamic_cast<Derived*>(bp)) {// 使用dp指向的Derived对象
} else {    // bp指向一个Base对象// 使用dp指向的Base对象
}

2.3 引用类型的 dynamic_cast

void f(const Base &b) {try {const Derived &d = dynamic_cast<const Derived&>(b);// 使用b引用的Derived对象} catch (bad_cast) {// 处理类型转换失败的情况}
}

C++ Primer 5th笔记(chap 19 特殊工具与技术)运行时类型识別RTTI相关推荐

  1. C++ Primer 5th笔记(chap 19 特殊工具与技术)枚举类型

    1. 枚举类型(enumeration) 将一组整型常量组织在一起. 1.1 限定作用域 的 枚 举 类 型( scoped enumeration) 关 键 字 enum class ( enum ...

  2. C++ Primer 5th笔记(chap 19 特殊工具与技术)异常类层次

    1. 类 exception . bad_cast 和 bad_alloc 定 义 了 默 认 构 造 函 数 runtime_error 和 logic_error没有默认构造函数, 但是有一个可以 ...

  3. C++ Primer 5th笔记(chap 19 特殊工具与技术)typeid运算符

    1. typeid运算符(typeid operator) 它允许程序向表达式提问:你的对象是什么类型? typeid表达式的形式是typeid(e),其中e可以是任意表达式或类型的名字,它操作的结果 ...

  4. C++ Primer 5th笔记(chap 19 特殊工具与技术)type_info 类

    1. type_info 的操作 操作 描述 t1 == t2 如果type_info对象t1和t2表示同一种类型,则返回true t1 != t2 如果type_info对象t1和t2表示不同的类型 ...

  5. C++ Primer 5th笔记(chap 19 特殊工具与技术)typeid

    1. 通常情况下使用 typeid 比较两条表达式的类型是否相同或者比较一条表达式的类型是否与指定的类型相同 Derived *dp = new Derived; Base *bp = dp; // ...

  6. C++ Primer 5th笔记(chap 19 特殊工具与技术)使用 RTTI

    1. RTTI用处 当想为具有继承关系的类实现相等运算符时.对于两个对象来说,如果他们的类型相同并且对应的数据成员取值相同,则我们说这两个类是相等的. class Base {friend bool ...

  7. C++ Primer 5th笔记(chap 19 特殊工具与技术)定位 new 表达式

    1. 定位 new (placement new) 1.1 起因 内存分配和初始化分离开 Placement new allows you to construct an object in memo ...

  8. C++ Primer 5th笔记(chap 19 特殊工具与技术)malloc 函数与 free 函数

    void *operator new (size_t size) {if (void *mem = malloc (size) )return mem;elsethrow bad_alloc ( ); ...

  9. C++ Primer 5th笔记(chap 19 特殊工具与技术)控制内存分配

    1. new void operator new (size_t, void ) ;//不允许重新定义这个版本 string *sp = new string("a value") ...

最新文章

  1. hung-yi lee_p4_Bias And Variance
  2. 2017-3-10 SQL server 数据库 T--SQL语句
  3. 多点认证wi-fi_准备使用Wi-Fi 6:认证将于2019年第三季度启动
  4. android版本如何修改时间,如何修改Android系统默认时间
  5. TCP之1460MSS和1448负载
  6. scala 基础 ——关键字与特殊符号
  7. Swift - 多线程实现方式(3) - Grand Central Dispatch(GCD)
  8. delphi读取xml中的内容property name传递参数_python3 Json和XML数据解析
  9. 简单理解编程语言的工作原理
  10. 超实用的 Nginx 极简教程,覆盖了常用场景(转)
  11. php怎么创建以太坊钱包地址,php如何调用以太坊JSON-RPC接口创建钱包
  12. IOS调用微信扫一扫scanQRCode报错the permission value is offline verifying
  13. 9个GVP国产Java开源项目!是真滴哇塞
  14. 【第42期】游戏策划:如何让游戏帮助孩子成长?
  15. 那些年,被 3.15 点名的科技公司,你们还好吗?
  16. java开发手机app_java可以开发哪些软件
  17. 在Word2003中打开Word2007文档的方法及教程下载
  18. [BZOJ2876] [NOI2012]骑行川藏
  19. 王者荣耀皮肤壁纸爬取
  20. 词霸天下---1~2词根【仅供学习使用】

热门文章

  1. Makefile: -I(大写i)、-L、-l
  2. Linux文件的权限[srwxr-xr-x]
  3. 0666 | IPC_CREAT
  4. 【Scratch】青少年蓝桥杯_每日一题_2.23_小猫来回走
  5. php数组中插入数值,php中如何在数组指定位置插入数据单元
  6. java 贝塞尔_java贝塞尔曲线翻页效果
  7. 数据中心(机房)监控方案
  8. Colaboratory:手把手教你使用Google免费的云端IDE进行深度学习(免费的GPU加速)的详细攻略
  9. Linux+pycharm下 安装tensorflow时遇到的bug
  10. Nginx与安全有关的几个配置