1. 程式人生 > >C++類間轉換之dynamic_cast

C++類間轉換之dynamic_cast

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