dynamic_cast与static_castconst_castreinterpret_cast并列的4种类型转换操作之一。它可以将基类的指针显示转换为派生类的指针,或将基类的引用显示转换为派生类的引用。但与static_cast不同的是,它执行的不是无条件的转换,它在转换前会检查指针(或引用)所指向对象的实际类型是否与转换的目的类型兼容,如果兼容转换才会发生,才能得到派生类的指针(或引用),否则:

  • 如果执行的是指针类型的转换,会得到空指针。
  • 如果执行的是引用类型的转换,会抛出异常。
#include <iostream>using namespace std;class Base{public:virtual void fun1(){cout << "Base::fun1()" << endl;}virtual ~Base(){}
}; class Derived1 : public Base{public:virtual void fun1(){cout << "Derived1::fun1()" << endl;}virtual void fun2(){cout << "Derived1::fun2()" << endl;}
};class Derived2 : public Derived1{public:virtual void fun1(){cout << "Derived2::fun1()" << endl;}virtual void fun2(){cout << "Derived2::fun2()" << endl;}
};void fun(Base * b){b -> fun1();Derived1 * d = dynamic_cast<Derived1*> (b);  // 尝试将 b 转换为 Derived1 指针 if (d!=0) {                             // 判断转换是否成功 d -> fun2();}
}int main(){Base *base = new Base();fun(base);Derived1 *derived1 = new Derived1();fun(derived1);  // derived1 是 Derived1 类型的对象,对指向 derived1 的指针执行转换,成功得到  Derived1 类型的指针Derived2 *derived2 = new Derived2();fun(derived2); // Derived2 是 Derived1 的派生类,对指向 Derived2的指针执行转换,也能够成功得到 Derived1 类型的指针delete derived2;delete derived1;return 0;
}

注:
转换前类型必须是指向多态类型的指针,或多态类型的引用,而不能是指向非多态类型的指针或非多态类型的引用,这是因为C++只为多态类型在运行时保存用于运行时类型识别的信息。

C++ 使用dynamic_cast执行基类向派生类的转换相关推荐

  1. 14.11 基类与派生类关系的详细再探讨

    一:派生类对象模型简述 Men mymen:子类(派生类对象),包含多个组成部分(也就是多个子对象); <1>一个是含有派生类自己定义的成员变量,成员函数的子对象: <2>一个 ...

  2. C++中基类与派生类的构造函数和析构函数

    1.Cpp中的基类与派生类的构造函数 基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承.构造函数不能被继承是有道理的,因为即使继承了,它的名字和 ...

  3. C++基础之继承类和派生类

    (1)继承是创建一个具有某个类的属性和行为的新类的能力.原有的类称为基类,新创建的类称为派生类.派生类将基类中的所有成员作为自己的成员,同时派生类本身可以定义新的成员 (2)派生类只有一个基类的继承称 ...

  4. 派生类到基类的转换 和基类到派生类的转换

    一. 基类与派生类的转换     3种继承方式(公用.保护.私有继承)中,公用派生类才是基类真正的子类型,它完整地继承了基类的功能.     不同类型数据之间在一定条件下可以进行类型的转换.基类与派生 ...

  5. C++:基类和派生类

    4.1 派生类的声明 继承实例如下: class Person{ //声明基类Person public:void print(){cout<<"name:"<& ...

  6. 基类与派生类之间的转换关系

    一. 派生类到基类的转换: 1.可以使用派生类指针初始化基类指针,同样也可以使用派生类的引用或对象初始化基类的引用,注意这里提到的是对象的指针和引用而不是对象本身: (但是,在使用基类指针(或引用)指 ...

  7. 构造函数怎么在主函数调用_C++ 虚基类及其派生类构造函数(学习笔记:第7章 12)...

    虚基类及其派生类构造函数[1] 建立对象时所指定的类称为最远派生类. 虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的. 在整个继承结构中,直接或间接继承虚基类的所有派生类,都 ...

  8. c++中基类与派生类中隐含的this指针的分析

    先不要看结果,看一下你是否真正了解了this指针? 1 #include<iostream> 2 using namespace std; 3 4 class Parent{ 5 publ ...

  9. Python使用元类约束派生类中必须实现指定的成员

    推荐图书: <Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),董付国,清华大学出版社,2020年6月第1次印刷,2021年12月第11次印刷,山东省一流 ...

  10. c++,派生类对象可以对基类赋值,基类对派生类不可以赋值

    派生类对象可以对基类对象赋值,赋值时属于派生类独有的部分就舍弃不用. #include <iostream> using namespace std;class DemoA { publi ...

最新文章

  1. 【怎样写代码】对象克隆 -- 原型模式(一):问题案例
  2. vue 循环 递归组件_Vue一个案例引发的递归组件的使用
  3. python大神-Python代码怎么写,听听顶尖Python大神的建议
  4. C++实现glut绘制点、直线、多边形、圆
  5. linux vim分屏函数,Linux学习笔记之十二————vim编辑器的分屏操作
  6. rvm RuvyGem Cocoapods brew
  7. JS中的数据类型转换
  8. php 两个单词 正则表达式字符前_【阅读整理】正则表达式 - 基础篇
  9. 重新认识margin-top和margin-bottom
  10. 站立会议(11月23日
  11. 地铁沉降观测数据分析之巧用VBA编程处理
  12. 邮箱登陆html,用html写的简单的邮箱登陆界面
  13. Win7部署Web网站之IIs安装篇
  14. SeaweedFS基本介绍
  15. 曝猛! 许多行情软件自带的SAR指标是错的
  16. 数码管显示倒计时c语言程序,第32节:数码管中的倒计时程序
  17. 设置 IntelliJ IDEA 主题和字体的方法
  18. 【Docker学习笔记 三】Docker常用容器安装及图形化管理工具
  19. 安装Xp和Win7双系统方法(图文教程)
  20. 华为云618年中钜惠,服务器免费领三个月

热门文章

  1. checkbox的常见问题
  2. struts中简单的校验
  3. [github]使用——上传工程到新建的repo
  4. C++ STL下载和安装
  5. POJ1321 棋盘问题
  6. Eclipse 高亮显示
  7. JQuery获取与设置HTML元素的内容或文本的实现代码
  8. django 快速实现完整登录系统(cookie)
  9. Common Lisp 初学者快速入门指导
  10. HDOJ1216 Assistance Required 打表