C++Primer第十九章的动态类型转换部分讲的不是很清楚,于是自己查cpp的官方手册总结一下。

dynamic_cast < new-type > ( expression )        

  动态类型转换是可以安全的在继承体系将指针和引用进行向上、向下和横向的转换。其表达式的类型为运行时的动态类型。具体功能如下:

  一、和隐式转换,静态转换static_cast一样的功能

  1、增加const属性:在expression和new-type类型相同或new-type为void*时,转换结果为expression的指针或引用。并且可以在dynamic_cast前加上const限定符实现增加const属性。

const dynamic_cast < new-type > ( expression ) 

  2、向上转换upcast:和static_cast和隐式转换一样,dynamic_cast可以将派生类转换为基类。

  二、dynamic_cast独有的功能

  如果expression是一个指向具有多态特性的基类Base的指针或引用(静态类型),new-type是一个指向派生类Derived对象的指针或引用,具体进行那种转换根据expression的动态类型判断

  1、向下转换downcast:expression的动态类型为指向派生类Derived的指针或引用,并且Derived仅包含一份继承自Base的对象,则转换结果为指向Derived对象的指针或引用。(相当于从expressionh的父类转换为子类)

  2、横向转换sidecast:expression的动态类型为指向一个类的对象的指针或引用,该类公有继承自Base和Derivied(Derived不一定继承自Base)并且继承自Derived的子成员是明确的(必须是虚继承,不能有二义性)。则转换结果为指向Derived的指针或引用。(相当于expression动态类型对象的一个父类转换为另一个父类)

  三、转换失败时如果转换目标是指针类型则返回空指针,引用类型抛出一个bad_cast异常。

  这里直接使用官方例子

 1 #include <iostream>
2
3 struct V {
4 virtual void f() {} // must be polymorphic to use runtime-checked dynamic_cast
5 };
6 struct A : virtual V {};
7 struct B : virtual V {
8 B(V* v, A* a) {
9 // casts during construction (see the call in the constructor of D below)
10 dynamic_cast<B*>(v); // well-defined: v of type V*, V base of B, results in B*
11 dynamic_cast<B*>(a); // undefined behavior: a has type A*, A not a base of B
12 }
13 };
14 struct D : A, B {
15 D() : B(static_cast<A*>(this), this) { }
16 };
17
18 struct Base {
19 virtual ~Base() {}
20 };
21
22 struct Derived: Base {
23 virtual void name() {}
24 };
25
26 int main()
27 {
28 D d; // the most derived object
29 A& a = d; // upcast, dynamic_cast may be used, but unnecessary
30 [[maybe_unused]]
31 D& new_d = dynamic_cast<D&>(a); // downcast
32 [[maybe_unused]]
33 B& new_b = dynamic_cast<B&>(a); // sidecast
34
35
36 Base* b1 = new Base;
37 if(Derived* d = dynamic_cast<Derived*>(b1))
38 {
39 std::cout << "downcast from b1 to d successful\n";
40 d->name(); // safe to call
41 }
42
43 Base* b2 = new Derived;
44 if(Derived* d = dynamic_cast<Derived*>(b2))
45 {
46 std::cout << "downcast from b2 to d successful\n";
47 d->name(); // safe to call
48 }
49
50 delete b1;
51 delete b2;
52 }

  输出结果

downcast from b2 to d successful

参考文献:dynamic_cast conversion - cppreference.com

动态类型转换dynamic_cast的更多相关文章

  1. C/C++杂记:运行时类型识别(RTTI)与动态类型转换原理

    运行时类型识别(RTTI)的引入有三个作用: 配合typeid操作符的实现: 实现异常处理中catch的匹配过程: 实现动态类型转换dynamic_cast. 1. typeid操作符的实现 1.1. ...

  2. 【转载】C/C++杂记:运行时类型识别(RTTI)与动态类型转换原理

    原文:C/C++杂记:运行时类型识别(RTTI)与动态类型转换原理 运行时类型识别(RTTI)的引入有三个作用: 配合typeid操作符的实现: 实现异常处理中catch的匹配过程: 实现动态类型转换 ...

  3. C++杂记:运行时类型识别(RTTI)与动态类型转换原理

    运行时类型识别(RTTI)的引入有三个作用: 配合typeid操作符的实现: 实现异常处理中catch的匹配过程: 实现动态类型转换dynamic_cast. 1. typeid操作符的实现 1.1. ...

  4. C++高效安全的运行时动态类型转换

    关键字:static_cast,dynamic_cast,fast_dynamic_cast,VS 2015. OS:Window 10. C++类之间类型转换有:static_cast.dynami ...

  5. 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换

    作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...

  6. C# 4 dynamic 动态对象 动态类型转换

    public class User { //使用省缺参数,一般不需要再为多态做各种静态重载了 public User( string name = "anonym", string ...

  7. C++运行时动态类型

    RTTI 运行时类型识别(RTTI)的引入有三个作用: 配合typeid操作符的实现: 实现异常处理中catch的匹配过程: 实现动态类型转换dynamic_cast typeid操作符的实现 静态类 ...

  8. static_cast 、const_cast、dynamic_cast、reinterpret_cast 关键字简单解释

    static_cast .const_cast.dynamic_cast.reinterpret_cast 关键字简单解释: Static_cast 静态类型转换 ①用于类层次结构中基类(父类)和派生 ...

  9. C++学习(二)

    九.3.内联1)编译器用函数的二进制代码替换函数调用语句,减少函数调用的时间开销.这种优化策略成为内联.2)频繁调用的简单函数适合内联,而稀少调用的复杂函数不适合内联.3)递归函数无法内联.4)通过i ...

随机推荐

  1. 12、MyBatis教程之缓存

    13.缓存 简介 1.什么是缓存 [ Cache ]? 存在内存中的临时数据. 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高 ...

  2. [系统重装日志3]autocad和ps破解安装

    cad 以前保存的安装包注册机还让杀毒软件给自动删除了!!!(╯‵□′)╯︵┻━┻!!!又在网上找的注册机!!!(╯‵□′)╯︵┻━┻!!!软件安装包必须保存一份压缩的!!!(╯‵□′)╯︵┻━┻!! ...

  3. Docker的深入浅出

    定义: Docker是一个虚拟环境容器,可以将你的开发环境.代码.配置文件等一并打包到这个容器中,并发布和应用到任意平台中. 原理: docker底层使用了LXC来实现,LXC将linux进程沙盒化, ...

  4. GO基础知识分享

    目录 GO基础知识分享 go语言的基本事项 关键字 字符串的拼接和变量的定义方式 空白符 const常量 iota的用法 运算符 Go 没有三目运算符,不能适用?: 语言条件语句 for循环的方式 函 ...

  5. vue实现拖拽排序

    基于vue实现列表拖拽排序的效果 在日常开发中,特别是管理端,经常会遇到要实现拖拽排序的效果:这里提供一种简单的实现方案. 此例子基于vuecli3 首先,我们先了解一下js原生拖动事件: 在拖动目标 ...

  6. 三分钟玩转微软AI量化投资开源库QLib

    更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 微软QLib简介 微软亚洲研究院发布了 AI 量化投资开源平台"微矿 Qlib".Q ...

  7. vue-cli2 项目中使用node-sass

    公司的项目,换了个电脑要重新安装一下依赖,但是直接npm install的时候报错了,提示node-sass未安装成功. 然后直接npn install node-sass --save 的时候还是下 ...

  8. 5. linux 中“~”,“/”,“#”,”$“ 含义

    "~" ~ 是用户的home目录(又叫"用户家目录")linux存储是以挂载的方式,相当于是树状的,源头就是"/",也就是根目录.而每个用户 ...

  9. https如何使用python+flask来实现

    摘要:一般http中存在请求信息明文传输,容易被窃听截取:数据的完整性未校验,容易被篡改:没有验证对方身份,存在冒充危险.面对这些问题,怎么破? 一.为什么要用https 一般http中存在如下问题: ...

  10. 阿里云 RTC QoS 弱网对抗之 LTR 及其硬件解码支持

    LTR 弱网对抗由于需要解码器的反馈,因此用硬件解码器实现时需要做一些特殊处理.另外,一些硬件解码器对 LTR 的实现不是特别完善,会导致出现解码错误.本文为 QoS 弱网优化系列的第三篇,将为您详解 ...