c++——dynamic_cast的使用
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的使用相关推荐
- When should static_cast, dynamic_cast and reinterpret_cast be used?
这是我偶然在 http://stackoverflow.com/questions/ 网页上发现的一个问题(类似博客园的博问),问题主要是关于询问应该怎样使用,以及何时使用C++里面的这几种类型转换操 ...
- C++中static_cast/const_cast/dynamic_cast/reinterpret_cast的区别和使用
C风格的强制转换较简单,如将float a转换为int b,则可以这样:b = (int)a,或者b=int(a). C++类型转换分为隐式类型转换和显示类型转换. 隐式类型转换又称为标准转换,包括以 ...
- C++显示转换、dynamic_cast重点
命名的强制类型转换 具体格式如下: cast-name<type>(expression) type是转换的目标类型 expression是要转换的对象 cast-name包括static ...
- static_cast, dynamic_cast, const_cast
首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为"标准转换",包括以下几种情况: 1) 算术转换(Arithmetic ...
- 基类和派生类中使用static_cast和dynamic_cast进行类型转换
2019独角兽企业重金招聘Python工程师标准>>> 先看代码: #include <iostream>using namespace std;class A { pu ...
- 【C++ 语言】类型转换 ( 转换操作符 | const_cast | static_cast | dynamic_cast | reinterpret_cast | 字符串转换 )
文章目录 I . const_cast 转换操作符 II . static_cast 转换操作符 III . dynamic_cast 转换操作符 IV . reinterpret_cast 转换操作 ...
- dynamic_cast, static_cast, const_cast, reinterprt_cast浅析
用法:dynamic_cast < type-id > ( expression ) 说明:Type-id必须是类的指针.类的引用或者void *:如果type-id是指针类型,那么exp ...
- C++ 使用dynamic_cast执行基类向派生类的转换
dynamic_cast是与static_cast,const_cast,reinterpret_cast并列的4种类型转换操作之一.它可以将基类的指针显示转换为派生类的指针,或将基类的引用显示转换为 ...
- C++ dynamic_cast操作符
在C++中,编译期的类型转换有可能会在运行时出现错误,特别是涉及到类对象的指针或引用操作时,更容易产生错误.Dynamic_cast操作符则可以在运行期对可能产生问题的类型转换进行测试. #inclu ...
- C++强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast
一.static_cast:static_cast<new_type> (expression) static_cast相当于传统的C语言里的强制转换,该运算符把expression转换为 ...
最新文章
- iPhone开源系列:iDev Recipes
- iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案—scrollIntoView()
- 从并发视角来看智能合约(上)【渡鸦论文系列】
- Linux与Windows关于标准输入中涉及EOF的处理方式
- 贯穿时域与频域的方法——傅立叶分析
- 【渝粤教育】国家开放大学2018年春季 8616-22T食品营养卫生 参考试题
- 数学建模-非线性优化模型
- hashcode值相同的字符串
- 小米便签源码分析——tool包
- leetcode 51. N-Queens N 皇后(困难)
- 马尔可夫性的统计检验(马氏性检验)
- vmware反复触发numlock问题
- 【转载:80个Python经典资料(教程+源码+工具)汇总】
- msgbox php,HTML_MsgBox函数语言参考,描述 在对话框中显示消息 - phpStudy
- Android 9 Audio系统笔记:AudioFlinger音频流处理流程
- Windows Defender内核隔离无法关闭,提示此设置由管理员进行管理
- 【AI每日播报】首次超越LSTM : Facebook 门卷积网络新模型能否取代递归模型
- 平安云:在群雄逐鹿的云市场中野蛮生长
- 院士任校长!“东方理工大学” 正式开工!
- python 完美压缩文件夹为zip格式