C++类型转换之dynamic_cast
来源:互联网 发布:电视这么连接有线网络 编辑:程序博客网 时间:2024/04/30 01:28
C++提供了一种新的类型转换运算符,专门用于继承的情形,这种情形在c语言中不存在。
再说dynamic_cast之前,我想先说说static_cast
Base* pBase=new Derived();Derived* pDerived=static_cast<Derived*>(pBase);
这段代码是没有什么问题的,如果是转化为无关的类指针,
CUnrelated pUnrelated=static_cast<CUnrelated*>(pBase);
Base* pBase=new Base();Derived* pderived=static_cast<Derived*>(pBase);
使用dynamic_cast
destination_type* pDest=dynamic_cast<class_type*)(pSource);if(pDest) //check for success of //the casting operation before using point pDest->CallFunc();
eg:
Derived* pDerived=dynamic_cast<Derived*>(pBase);if(pDerived) pDerived->callderivedClassFunction();
给定一个指向基类对象的指针,程序员可以使用dynamic_cast进行类型转换,并在使用指针前检查指针指向目标对象的类型。下面给一个完整的例子。
#include <iostream>using namespace std; class Fish{public: virtual void Swim() { cout << "Fish swims in water" << endl; } // base class should always have virtual destructor virtual ~Fish() {} };class Tuna: public Fish{public: void Swim() { cout << "Tuna swims real fast in the sea" << endl; } void BecomeDinner() { cout << "Tuna became dinner in Sushi" << endl; }};class Carp: public Fish{public: void Swim() { cout << "Carp swims real slow in the lake" << endl; } void Talk() { cout << "Carp talked crap" << endl; }};void DetectFishType(Fish* InputFish){ Tuna* pIsTuna = dynamic_cast <Tuna*>(InputFish); if (pIsTuna) { cout << "Detected Tuna. Making Tuna dinner: " << endl; pIsTuna->BecomeDinner(); // calling Tuna::BecomeDinner } Carp* pIsCarp = dynamic_cast <Carp*>(InputFish); if(pIsCarp) { cout << "Detected Carp. Making carp talk: " << endl; pIsCarp->Talk(); // calling Carp::Talk } cout << "Verifying type using virtual Fish::Swim: " << endl; InputFish->Swim(); // calling virtual function Swim}int main(){ Carp myLunch; Tuna myDinner; // Carp* MyCarp = &myLunch; // Fish* MyFish = MyCarp; // Carp* MyCarpAgain = MyFish; DetectFishType(&myDinner); cout << endl; DetectFishType(&myLunch); return 0;}
结果如下:
而如果不适用dynamic_cast来转换,使用强制转换,我们修改一处
void DetectFishType(Fish* InputFish){ Tuna* pIsTuna =(Tuna*)InputFish ;//dynamic_cast <Tuna*>(InputFish); if (pIsTuna) { cout << "Detected Tuna. Making Tuna dinner: " << endl; pIsTuna->BecomeDinner(); // calling Tuna::BecomeDinner }
我们发现,使用强制转换后,可以将pCarp*类型转换为pTuna*类型,有时候这是我们需要的,有时候是我们不需要的。采用强制转换,即便是pFish类型,也能满足if(pIsTuna)的判断,进而输出,而使用dynamic_cast
举个例子:dynamic_cast就像一个姑娘,为了躲避仇家,化妆为男性,一路蒙混过关,但不管怎么样,危机关头还是表现出女性的害怕,改变不了。而强制转换,就是去泰国做手术,变性,完完全全改变了原来的特征。
C++还有reinterpret_cast类型、const_cast类型,,但是建议尽量不使用它们,就像你家里备有感冒药,却不把它当饭吃,仅当你真正需要时才使用。
- c++类型转换之dynamic_cast
- C++类型转换之dynamic_cast
- c++ 类型转换(c cast static_cast dynamic_cast)
- C++类型转换之static_cast和dynamic_cast
- c++类型转换dynamic_cast
- 【C++】强制类型转换(static_cast,reinterpret_cast,const_cast,dynamic_cast,explicit)
- [C++] 强制类型转换static_cast、dynamic_cast、reinterpret_cast和const_cast
- c++dynamic_cast、const_cast 、static_cast、reinterpret_cast强制类型转换
- C++类型转换之static_cast, dynamic_cast, reinterpret_cast, const_cast探讨
- C++中的类型转换之 const_cast static_cast dynamic_cast reinterpret_cast
- 类型转换static_cast,reinterpret_cast,dynamic_cast
- C++类型转换dynamic_cast解析
- C++强制类型转换 dynamic_cast
- dynamic_cast 动态强制类型转换
- c++强制转换之dynamic_cast
- C语言之类型转换
- C语言之类型转换
- C语言之类型转换
- CQOI2016游记
- 217. Contains Duplicate
- cf - #346 E-New Reform
- AsyncTask异步任务
- 如何阅读一本书(2)
- C++类型转换之dynamic_cast
- iOS 简单基础知识点(2)-xib
- 关于polymer原生组件paper-input的部分属性的使用心得
- linux 程序存储结构
- VMware下Linux如何ping通Windows
- nyoj 860又见01背包
- Python 入门学习
- POJ 1236 Tarjan算法
- ubuntu下安装nginx及基本指令