dynamic_cast是四个强制类型转换操作符中最特殊的一个,它支持运行时识别指针或引用。

>>>>>>>>>>>编译器的RTTI设置>>>>>>>>>>>

dynamic_cast提供RTTI(Run-Time Type Information),也就是运行时类型识别。它对编译器有要求,需要编译器启动“运行时类型信息”这一选项。当编译器不开启RTTI时,运行含有dynamic_cast操作符的程序时会出现一个警告:

warning C4541: “dynamic_cast”用在了带 /GR- 的多态类型“ANIMAL”上;可能导致不可预知的行为

VS2010在默认下是开启RTTI的,也可以自己手动去开启或者关闭,操作如下:

视图->解决方案资源管理器
在打开的解决方案管理器中,对着项目名称右击,选择属性
配置属性-〉C/C++

>>>>>>>>>>>>>步入正题>>>>>>>>>>>>>

  • dynamic_cast主要用于“安全地向下转型”

dynamic_cast用于类继承层次间的指针或引用转换。主要还是用于执行“安全的向下转型(safe downcasting)”,也即是基类对象的指针或引用转换为同一继承层次的其他指针或引用。至于“先上转型”(即派生类指针或引用类型转换为其基类类型),本身就是安全的,尽管可以使用dynamic_cast进行转换,但这是没必要的, 普通的转换已经可以达到目的,毕竟使用dynamic_cast是需要开销的。

class Base{public:    Base(){};    virtual void Show(){cout<(der); //正确,但不必要。    base = der; //先上转换总是安全的    base->Show();     system("pause");}                                   学习交流群:894479708                        欢迎所有初学和进阶者一起讨论学习!

dynamic_cast与继承层次的指针

对于“向下转型”有两种情况。一种是基类指针所指对象是派生类类型的,这种转换是安全的;另一种是基类指针所指对象为基类类型,在这种情况下dynamic_cast在运行时做检查,转换失败,返回结果为0;

#include "stdafx.h"#includeusing namespace std;class Base{public:    Base(){};    virtual void Show(){cout<(base))    {        cout<Show();        cout<(base1))    {        cout<Show();    }    else     {        cout<

运行结果:

  • dynamic_cast和引用类型

在前面的例子中,使用了dynamic_cast将基类指针转换为派生类指针,也可以使用dynamic_cast将基类引用转换为派生类引用。

同样的,引用的向上转换总是安全的:

    Derived c;    Derived & der2= c;    Base & base2= dynamic_cast(der2);//向上转换,安全    base2.Show();

所以,在引用上,dynamic_cast依旧是常用于“安全的向下转型”。与指针一样,引用的向下转型也可以分为两种情况,与指针不同的是,并不存在空引用,所以引用的dynamic_cast检测失败时会抛出一个bad_cast异常:

int main(){        //第一种情况,转换成功    Derived b ;    Base &base1= b;    Derived &der1 = dynamic_cast(base1);    cout<(base);    }    catch(bad_cast)                                                                             学习交流群:894479708                                                欢迎所有初学和进阶者一起讨论学习!                                    {        cout<

运行结果:

  • 使用dynamic_cast转换的Base类至少带有一个虚函数

当一个类中拥有至少一个虚函数的时候,编译器会为该类构建出一个虚函数表(virtual method table),虚函数表记录了虚函数的地址。如果该类派生了其他子类,且子类定义并实现了基类的虚函数,那么虚函数表会将该函数指向新的地址。虚表是C++多态实现的一个重要手段,也是dynamic_cast操作符转换能够进行的前提条件。当类没有虚函数表的时候(也即一个虚函数都没有定义),dynamic_cast无法使用RTTI,不能通过编译(个人猜想...有待验证)。

  当然,虚函数表的建立对效率是有一定影响的,构建虚函数表、由表查询函数 都需要时间和空间上的消耗。所以,除了必须声明virtual(对于一个多态基类而言),不要轻易使用virtual函数。对于虚函数的进一步了解,可以查看《Effective C++》


获取更多:关注我 看我主页加入我们的学习大军!

更多笔记,资料,教程 >>>>>>>> 私信 “资料” 获取

project facets中没有dynamic_C++强制类型转换操作符 dynamic_cast相关推荐

  1. C++强制类型转换操作符 dynamic_cast

    dynamic_cast是四个强制类型转换操作符中最特殊的一个,它支持运行时识别指针或引用. >>>>>>>>>>>编译器的RTTI设 ...

  2. dim private public static_C++ 强制类型转换操作符 static_cast

    (给CPP开发者加星标,提升C/C++技能) 来源:melonstreet https://www.cnblogs.com/QG-whz/p/4509710.html static_cast是一个强制 ...

  3. C++中4种强制类型转换 ?

    C++中4种强制类型转换 前言 C风格的转换格式很简单,但是有不少缺点 C++中的类型转换: 一.static_cast转换 二.dynamic_cast转换 三.const_cast转换 四.rei ...

  4. 深入理解C++中五种强制类型转换的使用场景

    深入理解C++中五种强制类型转换的使用场景 1.C风格的强制类型转换 2.C++风格的强制类型转换 2.1.static_cast 2.1.1.用于基本内置数据类型之间的转换 2.1.2.用于指针之间 ...

  5. C++ 强制类型转换操作符(static_cast、dynamic_cast、const_cast和reinterpret_cast)

    C++中的四种操作符形式类型转换 1.static_cast (静态类型转换) 主要使用场景:适用于将void*转换为其他的指针 int a = 100; void* pv = &a; //i ...

  6. JS中的数据强制类型转换

    1.含义 强制类型转换指的是将一个数据类型强制转换为其他的数据类型 类型转换主要指,将其他的数据类型,转换为 String Number Boolean即字符串,数值和布尔值 2.将其他的数据类型转换 ...

  7. android类型强制转换,android中如何进行强制类型转换

    匿名用户 1级 2012-06-21 回答 Java 的自动转换 如果下列2个条件都能满足,那么将一种类型的数据赋给另外一种类型变量时,将执行自动类型转换(automatic type convers ...

  8. C++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast

    static_cast(可能不安全):一般.对象指(引)上行/下行转换 dynamic_cast(运行时的安全检查--抛出异常/NULL):对象指(引)上行/下行转换 const_cast:   主要 ...

  9. 显式强制类型转换static_cast, dynamic_cast, const_cast, reinterpret_cast

    显式强制类型转换(cast)包括以下操作符: static_cast,  dynamic_cast, const_cast, reinterpret_cast,对各种显式类型转换解释: static_ ...

最新文章

  1. centos设置固定IP方法
  2. UNIX进程的创建,进程链和进程扇
  3. 快速搭建ELK,以及简单故障处理
  4. php mail函数 附件,[php]mail函数发送邮件(正文+附件+中文)
  5. 北邮校园网自动登录 python
  6. 使用独立主机时需要关注的问题
  7. git-svn — 让git和svn协同工作
  8. word取消下一页_word文档页码设置及文中小箭头清除办法
  9. jndi mysql数据库_JNDI连接数据库
  10. hashmap删除指定key_Java集合之HashMap源码解析(JDK8)
  11. 现代软件工程讲义 如何提出靠谱的项目建议
  12. readonly strong nonatomic 和IBOutlet
  13. 智慧档案库房库房一体化安全管控平台方案【转载】
  14. android app icon素材,史上最全的APP图标模板素材以及设计格式最全的
  15. 基于深度学习技术的AI输入法引擎
  16. 如何把PPT连背景一起复制?
  17. get请求图片出现403 防盗链解决方式 no-referrer
  18. 「团队训练赛」2021 Jiangsu Collegiate Programming Contest题解
  19. 2023年系统集成项目管理工程师报考条件及时间安排
  20. flink监控prometheus/influxdb + grafana企业实战

热门文章

  1. 保证MQ消费消息的幂等性,真可以用版本号的方式?
  2. 硬刚 Kafka,Apache 顶级项目背后的公司完成数百万美元 Pre-A 轮融资
  3. 小米否认“造车”;微软中国回应关闭实体直营店;Angular 10 发布 | 极客头条...
  4. 未来 12 个月,哪种编程语言将会流行?
  5. 为什么要发明面向对象编程?
  6. Wi-Fi 6这么“6” 原来靠的是这些黑科技!
  7. 开源公司 HashiCorp 国内险遭禁,阿里、华为也要做好 B 计划?
  8. 战疫,微软资深高管的十余年远程办公管理经验
  9. 苹果官网以旧换新价格暴跌;戴威退出 ofo 法人代表及高管;TensorFlow 2.1.0 发布| 极客头条...
  10. 程序员离无人值班有多远?