C++類間轉換之dynamic_cast
阿新 • • 發佈:2017-05-12
cast 但是 對象 turn [] cpp 情況 相同 可能
當在C++的基類與派生類之間轉換時,其多態性充分顯現出來;
本次只討論 dynamic_cast 的用法。
在查閱資料後發現百度百科關於 dynamic_cast (以及static_cast) 的代碼說得十分清楚,摘抄如下(正所謂英雄不問出處):
#include"stdafx.h" #include<iostream> #include<stdlib.h> using namespace std; class Base { public: virtual void f(){cout<<"Base::f"<<endl;} void f1(){cout<<"Base::f1"<<endl;} private: double x; double y; }; class Derived:public Base { public: virtual void f(){cout<<"Derived::f"<<endl;} virtual void k(){cout<<"Derived::k"<<endl;} private: double z; }; class Base1 { public: virtual void g(){cout<<"Base1::g"<<endl;} void g1(){cout<<"Base1::g1"<<endl;} }; class Derived1:public Base,public Base1 { public: virtual void f(){cout<<"Derived1::f"<<endl;} virtual void h(){cout<<"Derived1::h"<<endl;} }; void Test1() { //對於單繼承, //如果pD真的指向Derived,用dynamic_cast和static_cast效果相同 cout<<"-----------------Test1-----------------"<<endl; Base* pD=new Derived; Derived* pD1=dynamic_cast<Derived*>(pD); pD1->f(); pD1->k(); pD1->f1(); Derived* pD2=static_cast<Derived*>(pD); pD2->f(); pD2->k(); pD2->f1(); //但是如果pB不是真的指向Derived,則用dynamic_cast則返回NULL,能夠更早的禁止error的發生, //如果用static_cast雖然返回的不為NULL,但是運行時可能拋出exception。 /**/////Errorcode //Base*pB=new Base(); //Derived*pD3=static_cast<Derived*>(pB); //pD3->f(); //pD3->k(); //pD3->f1(); //Derived*pD4=dynamic_cast<Derived*>(pB); //pD4->f(); //pD4->k(); //pD4->f1(); } void Test2() { //對於多重繼承, //如果pD真的指向的是Derived1,使用dynamic_cast和static_cast都可以轉化為Derived1, //但是如果要轉化為Base的兄弟類Base1,必須使用dynamic_cast,使用static_cast不能編譯。 cout<<"-----------------Test2-----------------"<<endl; Base* pD=new Derived1; Derived1* pD1=dynamic_cast<Derived1*>(pD); pD1->f(); pD1->h(); pD1->f1(); Base1* pB1=dynamic_cast<Base1*>(pD); pB1->g(); Derived1* pD2=static_cast<Derived1*>(pD); pD2->f(); pD1->h(); pD2->f1(); /**/////errorcannotcompiler //Base1*pB2=static_cast<Base1*>(pD); //pB2->g(); //當然對於pB不是真的指向Derived1,想要轉化為Derived1或Base的兄弟類Base1,情況與Test1中的error情況相同。 } void Test3() { cout<<"-----------------Test3-----------------"<<endl; Derived1* pD1=new Derived1; Base1* pB1= pD1; //此時pB1可以訪問g(),g1() Base* pB = dynamic_cast<Base*>(pB1); //兄弟類之間的轉換 pB->f(); //Base類f()被覆蓋,訪問的是Derive1類的f(),這一點有點像是“基類對象訪問派生類的函數” pB->f1(); } int _tmain(int argc,_TCHAR*argv[]) { Test1(); Test2(); Test3(); system("Pause"); return 0 ; }
其中Test3()所測試的功能Test2()中已有。
Test3()中基類對象指針pB在訪問f()時,由於Base類f()被覆蓋,所以訪問的是Derive1類的f();
另外對於 static_cast 的用法,這裏就不多說了,自己去查吧。
C++類間轉換之dynamic_cast