1)dynamic_cast要求操作数必须是多态类型(即要求父类要存在virtual虚函数);

class Base
{
public:Base() {}~Base() {}void test(){cout << "Base" << endl;}
};class Derived : public Base
{
public:Derived(){}~Derived(){}void test(){cout << "Derived" << endl;}
};int main()
{Base* pB = new Derived();Derived* pD = dynamic_cast<Derived*>(pB);  // error: dynamic_cast要求操作数必须是多态类型system("pause");return 0;
}

2)单继承情况,可以判断dynamic_cast强转后的指针是否为空判断是否转换成功;

class Base
{
public:Base() {}~Base() {}virtual void test(){cout << "Base" << endl;}
};class Derived : public Base
{
public:Derived(){}~Derived(){}virtual void test(){cout << "Derived" << endl;}
};int main()
{// 1. 单继承  pD指向的是DerivedBase* pB = new Derived();Derived* pD = dynamic_cast<Derived*>(pB);if (nullptr == pD)cout << "pD is nullptr!" << endl;// 2. 单继承 pD1不是指向Derived 此时dynamic_cast强转后返回nullptrBase* pB1 = new Base();Derived* pD1 = dynamic_cast<Derived*>(pB1);  if (nullptr == pD1)cout << "pD1 is nullptr!" << endl;system("pause");return 0;
}

3)多继承;

class Base
{
public:Base() {}~Base() {}virtual void test(){cout << "Base" << endl;}
};class Base1
{
public:Base1() {}~Base1() {}virtual void test1(){cout << "Base1" << endl;}
};class Derived : public Base, public Base1
{
public:Derived(){}~Derived(){}virtual void test(){cout << "Derived" << endl;}virtual void test1(){cout << "Derived-1" << endl;}
};int main()
{// 1. 多继承  pD指向的是DerivedBase* pB = new Derived();Derived* pD = dynamic_cast<Derived*>(pB);if (nullptr == pD)cout << "pD is nullptr!" << endl;// 2. 多继承 pD1指向的是DerivedBase1* pD1 = dynamic_cast<Base1*>(pB);if (nullptr == pD1)cout << "pD1 is nullptr!" << endl;pD1->test1();  // 打印 Derived-1system("pause");return 0;
}

4)基类强转为派生类,此种方式无效,dynamic_cast返回的指针为nullptr;

class Base
{
public:Base() {}~Base() {}virtual void test(){cout << "Base" << endl;}
};class Base1
{
public:Base1() {}~Base1() {}virtual void test1(){cout << "Base1" << endl;}
};class Derived : public Base, public Base1
{
public:Derived(){}~Derived(){}virtual void test(){cout << "Derived" << endl;}virtual void test1(){cout << "Derived-1" << endl;}
};int main()
{Base* pB1 = new Base();Derived* pD2 = dynamic_cast<Derived*>(pB1);  // 转换无效 pD2为nullptrif (nullptr == pD2)cout << "pD2 is nullptr!" << endl;system("pause");return 0;
}

c++——dynamic_cast的使用相关推荐

  1. When should static_cast, dynamic_cast and reinterpret_cast be used?

    这是我偶然在 http://stackoverflow.com/questions/ 网页上发现的一个问题(类似博客园的博问),问题主要是关于询问应该怎样使用,以及何时使用C++里面的这几种类型转换操 ...

  2. C++中static_cast/const_cast/dynamic_cast/reinterpret_cast的区别和使用

    C风格的强制转换较简单,如将float a转换为int b,则可以这样:b = (int)a,或者b=int(a). C++类型转换分为隐式类型转换和显示类型转换. 隐式类型转换又称为标准转换,包括以 ...

  3. C++显示转换、dynamic_cast重点

    命名的强制类型转换 具体格式如下: cast-name<type>(expression) type是转换的目标类型 expression是要转换的对象 cast-name包括static ...

  4. static_cast, dynamic_cast, const_cast

    首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为"标准转换",包括以下几种情况: 1) 算术转换(Arithmetic ...

  5. 基类和派生类中使用static_cast和dynamic_cast进行类型转换

    2019独角兽企业重金招聘Python工程师标准>>> 先看代码: #include <iostream>using namespace std;class A { pu ...

  6. 【C++ 语言】类型转换 ( 转换操作符 | const_cast | static_cast | dynamic_cast | reinterpret_cast | 字符串转换 )

    文章目录 I . const_cast 转换操作符 II . static_cast 转换操作符 III . dynamic_cast 转换操作符 IV . reinterpret_cast 转换操作 ...

  7. dynamic_cast, static_cast, const_cast, reinterprt_cast浅析

    用法:dynamic_cast < type-id > ( expression ) 说明:Type-id必须是类的指针.类的引用或者void *:如果type-id是指针类型,那么exp ...

  8. C++ 使用dynamic_cast执行基类向派生类的转换

    dynamic_cast是与static_cast,const_cast,reinterpret_cast并列的4种类型转换操作之一.它可以将基类的指针显示转换为派生类的指针,或将基类的引用显示转换为 ...

  9. C++ dynamic_cast操作符

    在C++中,编译期的类型转换有可能会在运行时出现错误,特别是涉及到类对象的指针或引用操作时,更容易产生错误.Dynamic_cast操作符则可以在运行期对可能产生问题的类型转换进行测试. #inclu ...

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

    一.static_cast:static_cast<new_type> (expression) static_cast相当于传统的C语言里的强制转换,该运算符把expression转换为 ...

最新文章

  1. iPhone开源系列:iDev Recipes
  2. iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案—scrollIntoView()
  3. 从并发视角来看智能合约(上)【渡鸦论文系列】
  4. Linux与Windows关于标准输入中涉及EOF的处理方式
  5. 贯穿时域与频域的方法——傅立叶分析
  6. 【渝粤教育】国家开放大学2018年春季 8616-22T食品营养卫生 参考试题
  7. 数学建模-非线性优化模型
  8. hashcode值相同的字符串
  9. 小米便签源码分析——tool包
  10. leetcode 51. N-Queens N 皇后(困难)
  11. 马尔可夫性的统计检验(马氏性检验)
  12. vmware反复触发numlock问题
  13. 【转载:80个Python经典资料(教程+源码+工具)汇总】
  14. msgbox php,HTML_MsgBox函数语言参考,描述  在对话框中显示消息 - phpStudy
  15. Android 9 Audio系统笔记:AudioFlinger音频流处理流程
  16. Windows Defender内核隔离无法关闭,提示此设置由管理员进行管理
  17. 【AI每日播报】首次超越LSTM : Facebook 门卷积网络新模型能否取代递归模型
  18. 平安云:在群雄逐鹿的云市场中野蛮生长
  19. 院士任校长!“东方理工大学” 正式开工!
  20. python 完美压缩文件夹为zip格式

热门文章

  1. sqlserver设计表不允许保存更改,阻止保存要求重新创建表的更改
  2. 【干货】BIOS、UEFI、MBR、GPT、GRUB 到底是什么意思?
  3. 基于微信小程序Map标签及高德地图开源方法实现路径导航
  4. ldd 执行结果:不是动态可执行文件
  5. 【Tensorflow+Keras】tf.keras.layers.LSTM的解析与使用
  6. xpanx原理解析 | 只要 3 秒!抖音视频无水印下载
  7. 离散数学·命题逻辑【范式、推理】
  8. 电脑系统卡顿,怎么解决
  9. 如何写好测试用例的标题
  10. 力扣周赛 239 题解