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. java四种字符串拼接方式

    1.直接用"+"号 2.使用String的方法concat 3.使用StringBuilder的append 4.使用StringBuffer的append

  2. 【Django笔记0】-Django项目创建,settings设置,运行

    Django项目创建,settings设置,运行 1,项目创建 ​ 通过pip下载Django以后,在cmd中cd到想要创建项目的路径,之后输入: django-admin startproject ...

  3. 如何配置Nginx,实现http访问重定向到https?

    现在越来越多的网站,当我们输入域名时,会自动重定向到https,我们只需要简单修改下Nginx配置文件/usr/local/nginx/conf/nginx.conf(根据个人的实际存储路径)即可. ...

  4. Java类集框架详细汇总-底层分析

    前言: Java的类集框架比较多,也十分重要,在这里给出图解,可以理解为相应的继承关系,也可以当作重要知识点回顾: Collection集合接口 继承自:Iterable public interfa ...

  5. 深入理解Java并发框架AQS系列(四):共享锁(Shared Lock)

    深入理解Java并发框架AQS系列(一):线程 深入理解Java并发框架AQS系列(二):AQS框架简介及锁概念 深入理解Java并发框架AQS系列(三):独占锁(Exclusive Lock) 深入 ...

  6. BUAAOO第三单元总结

    JML理论基础 JML规定了一些语法,用这些语法可以描述一个方法,一个类的行为,理论基础是离散数学吧 JML常用语法 前置条件: 使用 require + 表达式 ,表达式一般为布尔表达式 副作用: ...

  7. Java中获取类的运行时结构

    获取运行时类的完整结构 通过反射获取运行时类的完整结构 Field(属性).Method(方法).Constructor(构造器).Superclass(父类).Interface(接口).Annot ...

  8. day-7 xctf-level2

    xctf-level2 题目传送门:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5 ...

  9. 11. man page,info page

    Linux系统中的命令可分为内部命令和外部命令.内部命令,又称为内建命令(builtin).怎么区分内部命令和外部命令了? 输入man bash命令,就可查看所有的内部命令. 如何查看命令使用方法 内 ...

  10. JAVAEE_04_Tomcat服务器

    Tomcat服务器 * 常用的服务器 - WebLogic服务器 WebLogic是美国bea公司出品的一个application server.BEA WebLogic是用于开发.集成.部署和管理大 ...