(dynamic_cast必須要有虛函式才能進行轉換,
static_cast
靜態轉換,不安全。)
執行時型別資訊通過運算子dynamic_cast來提供。
dynamic_cast
用來向下轉型,將基類指標轉換為派生類指標
.(把基類指標轉換為派生類指標)
運算子dynamic_cast(
ptr)用來將乙個指標型別轉換為另外乙個指標型別。它經常用來檢查乙個基類指標是否實際指向的是派生類物件。
ptr型別指標向下轉型為
t*(基類
ptr指向父類派生類t*)
什麼時候應必須使用dynamic_cast?
什麼時候dynamic_cast可以使用
static_cast
代替?
#include"stdafx.h"
#include
usingnamespacestd;
classbase
public:
virtual voidf(){cout<<"base::f"doublex;
doubley;
classderived:publicbase //單繼承
public:
virtual voidf(){cout<<"derived::f"doublez;
classbase1
public:
virtual voidg(){cout<<"base1::g"public:
virtual voidf(){cout<<"derived1::f"//對於單繼承,
//如果
pd真的指向
derived
,用dynamic_cast
和static_cast
效果相同
base*pd=newderived;
derived*pd1=dynamic_cast(pd);
pd1->f();
pd1->k();
pd1->f1();
derived*pd2=static_cast(pd);
pd2->f();
pd2->k();
pd2->f1();
//但是如果
pb不是真的指向
derived
,則用dynamic_cast
則返回null
,能夠更早的禁止
error
的發生,
//如果用
static_cast
雖然返回的不為
null
,但是執行時可能丟擲
exception。
/**/errorcode
//base*pb=newbase();
//derived*pd3=static_cast(pb);
//pd3->f();
//pd3->k();
//pd3->f1();
//derived*pd4=dynamic_cast(pb);
//pd4->f();
//pd4->k();
//pd4->f1();
voidtest2()
//對於多重繼承,
//如果
pd真的指向的是
derived1
,使用dynamic_cast
和static_cast
都可以轉化為
derived1,
//但是如果要轉化為
base
的兄弟類
base1
,必須使用
dynamic_cast
,使用static_cast
不能編譯。
base*pd=newderived1;
derived1*pd1=dynamic_cast(pd);
pd1->f();
pd1->h();
pd1->f1();
base1*pb1=dynamic_cast(pd);
pb1->g();
derived1*pd2=static_cast(pd);
pd2->f();
pd1->h();
pd2->f1();
/**/errorcannotcompiler
//base1*pb2=static_cast(pd);
//pb2->g();
//當然對於
pb不是真的指向
derived1
,想要轉化為
derived1
或base
的兄弟類
base1
,情況與
test1
中的error
情況相同。
int_tmain(intargc,_tchar*argv)
test1();
test2();
return0;
dynamic cast 動態操作
dynamic cast 動態操作 作用 將基類型別物件的引用或者指標轉換為同意繼承層次中其他型別的引用或者指標 注意事項 dynamic cast在執行時型別檢查。分為兩個操作 1.驗證被請求的轉換是否有效 2.進行轉換。為什麼驗證工作必須在執行時檢查?答 因為引用或者指標繫結的物件的型別在編譯時...
dynamic cast 安全轉換
上行轉換 子類指標轉父類指標 下行轉換 父類指標轉子類指標 上行轉換一定是安全的。即由子類指標轉為父類指標。下行轉換可能會有問題。對於上圖,a是父類 a 轉b 下行轉換,使用dynamic cast會得到null 即定義乙個物件 a 然後使用 dynamic cast 將其轉換為 b 下同。b 轉a...
Dynamic cast的效率問題
dynamic cast的作用 在derived class身上執行derived class 執行函式,手頭只有指向base的pointer或reference.方案一 class window class specialwindow public window 什麼也不做 class speci...