dynamic_cast运算符能够在运行时将一个对象强制转换成其实际类型:

实际应用场景:在C++学习笔记(13)中,在main.cpp里面定义了displayGeometric()函数,

void displayGeometric(const Geometric& g)
{cout << g.toString() << endl;
}

假设现在需要对这个函数进行修改:

函数参数类型不变,当参数时rectangle类型的对象时,输出width和height, 当参数是circle类型的对象时,输出半径 。

首先介绍一种错误的实现方法:

void displayGeometric(const Geometric& g)
{cout << "The radius is " << g.getRadius() << endl;cout << "The width is " << g.getWidth() << endl;cout << "The height is " << g.getHeight() << endl;
} 

很明显,这种方法是无法通过编译的!

在前面的学习中,知道static_cast能够对变量进行强制类型转换(静态转换)。能否通过static_cast实现呢?

void displayGeometric(const Geometric& g)
{Geometric* p = &g;cout << "The radius is " << static_cast<Circle*>(p)->getRadius() << endl;cout << "The width is " << static_cast<Rectangle*>(p)->getWidth() << endl;cout << "The height is " << static_cast<Rectangle*>(p)->getHeight() << endl;
} 

这样会存在函数 displayGeometric() 可能会将circle错误的转化为rectangle而调用getWidth()方法。所以任然是错误的,因为static_cast()不能对转换成功的结果进行检查,而我们的要求是,在调用getRadius()之前必须确保对象是一个circle.

dynamic_cast与static_cast的功能类似,但是,dynamic_cast在运行时进行检查从而保证转换的成功进行。转换失败会返回NULL. 所以用dynamic_cast可以实现上面要求的功能

void displayGeometric(const Geometric& g)
{Geometric* p = &g;Circle* p1 = dynamic_cast<Circle*>(p);Rectangle* p2 = dynamic_cast<Rectangle*>(p);if(p1 != NULL)  // Circle类性转换成功{cout << "The radius is " << p1->getRadius() << endl;} if(p2 != NULL)  // Rectangle转换成功{cout << "The width is " << p2->getWidth() << endl;cout << "The height is " << p2->getHeight() << endl;    }
} 

注:

dynamic_cast只能在多态类型的指针或者引用上使用,也就是说该类型必须包含虚函数,dynamic_cast可以在运行时检查强制转换是否成功。static_cast则在编译的时候起作用。

C++学习笔记(14) static_cast 与 dynamic_cast相关推荐

  1. node.js学习笔记14—微型社交网站

    node.js学习笔记14-微型社交网站 1.功能分析 微博是以用户为中心,因此需要有注册和登录功能. 微博最核心的功能是信息的发表,这个功能包括许多方面,包括:数据库访问,前端显示等. 一个完整的微 ...

  2. Linux学习笔记14

    Linux学习笔记14 Linux学习笔记14 DNS服务搭建 基本介绍 使用bind搭建dns服务 增加一个域名zone 配置DNS转发 配置主从 测试主从同步 后续课程 DNS服务搭建 基本介绍 ...

  3. 【转】 C#学习笔记14——Trace、Debug和TraceSource的使用以及日志设计

    [转] C#学习笔记14--Trace.Debug和TraceSource的使用以及日志设计 Trace.Debug和TraceSource的使用以及日志设计   .NET Framework 命名空 ...

  4. 台大李宏毅Machine Learning 2017Fall学习笔记 (14)Unsupervised Learning:Linear Dimension Reduction

    台大李宏毅Machine Learning 2017Fall学习笔记 (14)Unsupervised Learning:Linear Dimension Reduction 本博客整理自: http ...

  5. 华为HCIA-datacom 学习笔记14——WLAN概述

    华为HCIA-datacom 学习笔记14--WLAN概述 1.WLAN(无线局域网) 通过无线技术构造的无线局域网络.WLAN广义上是指以无线电波.激光.红外线等无线信号代替有线局域网中的部分或全部 ...

  6. 【白帽子学习笔记14】SQL注入常用语句

    [白帽子学习笔记14]SQL注入常用语句 目前网站中使用的最多的数据库要算是 ACCESS.SQL Server(MSSQL).MySQL 这三个了,所以这里的手工注入,我就以他们三个数据库来分成三 ...

  7. 影像组学视频学习笔记(14)-特征权重做图及美化、Li‘s have a solution and plan.

    本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(14)主要介绍: 特征权重做图及美化 import matplotlib.pyplot as plt %matplotlib inlin ...

  8. opencv进阶学习笔记14:分水岭算法 实现图像分割

    基础版学习笔记目录: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 分水岭算法原理 分水岭算法 ...

  9. opencv学习笔记14:图像礼帽,图像黑帽

    python + OpenCV 图像礼帽 图像礼帽 也叫图像顶帽 礼帽图像=原始图像-开运算图像 得到噪声图像 开运算:先腐蚀再膨胀 使用对象:二值图像 使用方法:morphologyEx cv2.M ...

最新文章

  1. (int),Int32.Parse() 和 Convert.toInt32() 的区别
  2. 网络流24题(2) P4014 分配问题
  3. windows 7装IIS
  4. android xml解析的三种方式
  5. Java中BigInteger的各种方法详解
  6. 二分法:木棒切割问题
  7. layui 如何动态加载局部页面_从输入URL到页面加载的过程?如何由一道题完善自己的前端知识体系!
  8. hdu 2255 奔小康赚大钱 KM算法
  9. 计算机培训中学语文研修计划,初中语文个人研修计划书
  10. 网友对各种杀软的评价诗歌
  11. visio对齐连接线
  12. windows添加hosts
  13. 台式计算机输入设备,简述常用的输入设备和输出设备有哪些 – 手机爱问
  14. [SOLVED]Manjaro内核更新后,Nvidia驱动无法链接的问题
  15. 英特尔hd630驱动,intel hd graphics 630驅動
  16. 原有人陪你颠沛流离 昨日书
  17. 大学什么专业会学python-学会python有哪些好处?python抓取知乎神回复
  18. 搭建一个简单的FAQ系统
  19. gprs实用技巧:gprs模块tcp连接稳定性测试
  20. 什么是开发中经常说的POCO

热门文章

  1. android学习笔记---66_自定义标签页
  2. 初学关键段容易忽略的问题
  3. Mac下Boost环境搭建
  4. php连接数据库配置优化,小蚂蚁学习mysql性能优化(9)--操作系统配置优化--mysql配置文件优化...
  5. 随想录(一个android原生app的代码赏析)
  6. 一步一步写算法(之线性队列)
  7. 西部数码服务器绑定域名解析,中国数据域名如何修改DNS设置方法
  8. 加密后变成乱码解密_个人磁盘加密软件,使用VeraCrypt进行整盘加密介绍
  9. linux跳转乌班图服务器,Ubuntu18.04连接Linux服务器与文件传输
  10. flutter持久化_开源项目【WanAndroid_Flutter】玩安卓 Flutter 版