使用dynamic_cast的一点心得

简介:
  C++程序员大多喜欢使用强制类型转换(我也是),尽管它是C遗留下来的,尽管它存在这样那样的缺点,但是你不能不承认它使用起来很方便,而且绝大多数情况下是不会产生问题的.极少数情况下可能会存在类型转换失败的情况,这时候就需要使用到dynamic_cast了,这里提到的"极少数情况"是这样的:如果有继承或多重继承的类对象,你在某些情况下得到某个对象的指针,而你又想将其转换为某个特定类型,但是由于C++中对象类型的多态性(它可以是多种类型),你又不能确定(在运行时)这么做一定会成功,此时可以使用dynamic_cast,充分利用C++的运行时检查机制.只是用语言描述太抽象了,举个例子吧.
 
  1. class A{...}; 
  2. class B:public A{...}; 
  3. class C:public B{...}; 
  4. void Fun1(B* pB) 
  5. A* pA  = (A*)pB; 
  6. C* pC  = (C*)pB; 
  7. ... 
  Fun1函数使用强制类型转换将pB转换为A*或C*,看出什么的问题了吗?
  如果这样调用Fun1:
                             Fun1(((B*)new C));
的确不会有问题,但如果是这样呢: 
                             Fun1(new B);
pC不会为NULL,能够想到使用pC指针时就程序就悲剧了.
更严重情况下,如果是这样: 
                             Fun1((B*)0X00005678);//0X00005678是一个随机值
pA,PC就不会是NULL,强制类型转换总是能够成功的,但使用这两个指针时程序肯定崩溃.当然你可以使用异常处理机制来处理这样的错误,不过这有点大才小用的感觉,最好能够找到一种能够检查出类型转换能否成功的办法.这时dynamic_cast就能大显身手了.
 
 
  1. A* pA  = dynamic_cast<A*>pB;// upcast. 
  2. if (NULL == pA){...} 
  3. C* pC  = dynamic_cast<C*>pB;// downcast. 
  4. if (NULL == pC){...} 

    dynamic_cast的具体作用这里不详细解释,仅仅抛砖引玉做一点说明.这里假设:
                              dynamic_cast < ObjectType-ID* > ( ObjectType*)

  如果要成功地将ObjectType*转换为ObjectType-ID*,则必须存在这种可能性才可以,也就是说ObjectType*指向的对象要"包含"ObjectType-ID*指向的对象,如此才能够成功.就上面的例子来说,C对象"包含"B对象,而B对象"包含"A对象,如果:
                      A* pA = new B;
那么
                   B* pB  = dynamic_cast<B*>pA;// OK.
                   C* pC  = dynamic_cast<C*>pA;// Fail.
如果说你不能确定这种包含关系,最好使用dynamic_cast.

 实际上可以把dynamic_cast看做是强制类型转换的一个子集,看成是更严格检查的强制类型转换,因为"更严格"所以能够检查出来错误.

  最后提一点,使用dynamic_cast,不要忘了编译选项GR.

 

 

 

 













本文转自jetyi51CTO博客,原文链接: http://blog.51cto.com/jetyi/671256,如需转载请自行联系原作者




相关文章
|
机器学习/深度学习 PyTorch Go
YOLOv5的Tricks | 【Trick4】参数重结构化(融合Conv+BatchNorm2d)
这篇文章是想要记录yolov5在模型搭建过程中的一个融合模块,就是把卷积与批归一化的参数进行融合,想卷积带有批归一化的性质,使得推理过程中可以加快模型推理速度,简化整个模型结构,实现训练与推理两个阶段的解耦。
1511 0
YOLOv5的Tricks | 【Trick4】参数重结构化(融合Conv+BatchNorm2d)
|
4月前
|
SQL 运维 关系型数据库
阿里云RDS MySQL 8.4正式发布:长期支持,平滑兼容,深度优化
阿里云RDS MySQL 8.4正式上线!作为首个LTS长期支持版,相比8.0寿命更长、稳定性更高,并深度集成AliSQL内核优化:秒级改列、大事务治理、复制延迟优化等。兼容MySQL 8.0语法与插件,支持平滑升级,EOL无忧。
|
9月前
|
弹性计算 网络协议 固态存储
阿里云服务器如何配置IPv6?共4个步骤
阿里云ECS多数实例支持IPv6,仅部分老旧或特殊规格不支持。配置IPv6共四步:先为VPC和交换机开通IPv6,再分配IPv6地址,接着在系统内配置IPv6,最后开通IPv6公网带宽。完成即可实现IPv6私网及公网通信,详细步骤可参考官方指南。
1875 12
|
PyTorch 算法框架/工具
Pytorch学习笔记(五):nn.AdaptiveAvgPool2d()函数详解
PyTorch中的`nn.AdaptiveAvgPool2d()`函数用于实现自适应平均池化,能够将输入特征图调整到指定的输出尺寸,而不需要手动计算池化核大小和步长。
1593 1
Pytorch学习笔记(五):nn.AdaptiveAvgPool2d()函数详解
|
PyTorch 算法框架/工具
Pytorch学习笔记(四):nn.MaxPool2d()函数详解
这篇博客文章详细介绍了PyTorch中的nn.MaxPool2d()函数,包括其语法格式、参数解释和具体代码示例,旨在指导读者理解和使用这个二维最大池化函数。
1419 0
Pytorch学习笔记(四):nn.MaxPool2d()函数详解
|
机器人 API 语音技术
企业微信接收语音消息并自动回复
本文介绍如何在企业微信中通过应用机器人实现语音消息的自动回复。具体步骤包括:创建企业微信应用,获取AgentID和Secret;使用AppFlow模版创建连接流并配置鉴权凭证;选择语音识别模型和大模型应用(如通义系列)进行自动回复;配置企业微信应用接收消息API及可信IP;最后测试应用功能。通过这些步骤,用户可以高效地利用大模型技术提升企业微信的使用体验。
2745 3
|
Linux Shell
linux 查看某个文件夹属于哪个盘
在 Linux 系统中,要查看某个文件夹属于哪个磁盘分区,你可以使用多种方法。以下是几种常见的方法: 方法一:使用 df 命令 df 命令用于显示文件系统的磁盘空间使用情况。 打开终端。 使用以下命令查看文件夹所属的磁盘分区: bash df -h /path/to/your/folder 其中 /path/to/your/folder 是你要查询的文件夹路径。 示例: bash df -h /home/user/Documents 输出将类似于: Filesystem Size Used Avail Use% Mounted on /dev/sda1
3381 1
|
传感器 监控 UED
基于STM32的智能停车场管理系统设计与实现
基于STM32的智能停车场管理系统设计与实现
1341 1