4.5dynamic_cast操作符

向上轉(zhuǎn)型:指用派生類指針指向基類對象

向下轉(zhuǎn)型:指將基類指針指向派生類對象

向下轉(zhuǎn)型不會有任何問題,而向上轉(zhuǎn)型默認情況下是不允許的

如果你一定要向上轉(zhuǎn)型,可以“勉強”使用強制類型轉(zhuǎn)換,強制轉(zhuǎn)換為派生類,但是這樣做是很有問題的。

dynamic_cast操作符

向上轉(zhuǎn)型是不安全的,不建議這樣做。當繼承關(guān)系比較復(fù)雜,或者搞不清繼承關(guān)系時,可以使用 dynamic_cast 操作符來保證轉(zhuǎn)型的安全。

dynamic_cast 只允許向下轉(zhuǎn)型,而不允許向上轉(zhuǎn)型。dynamic_cast 只能用在多態(tài)中(也就是有虛函數(shù)的類),因為它要遍歷繼承鏈,確定兩個類的“父子關(guān)系“。

請看下面的例子:

#include

using namespace std;

class A{

public:

virtual void display(){ cout<<"A::display()"<

};

class B: public A{

public:

void display(){ cout<<"B::display()"<

};

int main(){

B *p1 = dynamic_cast(new A);

if(p1){

p1->display();

}else{

cout<<"Base to Derived is error!"<

}

A *p2 = dynamic_cast(new B);

if(p2){

p2->display();

}else{

cout<<"Base to Derived is error!"<

}

return 0;

}

運行結(jié)果:

Base to Derived is error!

B::display()

dynamic_cast 的使用語法為:

dynamic_cast<目標類型>(變量或表達式);

目標類型只能是指針或引用,下面的用法是錯誤的:

B obj;

dynamic_cast(obj);

dynamic_cast 轉(zhuǎn)換成功后會返回對象的指針或引用,失敗則返回 null,所以可以通過 if 來判斷是否轉(zhuǎn)型成功。

讀者注意:dynamic_cast 的內(nèi)部實現(xiàn)要依賴于 RTTI,并且會通過 for 循環(huán)來遍歷繼承鏈,非常低效,能不用則不用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容