向上轉(zhuǎn)型:指用派生類指針指向基類對(duì)象
向下轉(zhuǎn)型:指將基類指針指向派生類對(duì)象
向下轉(zhuǎn)型不會(huì)有任何問(wèn)題卷扮,而向上轉(zhuǎn)型默認(rèn)情況下是不允許的
如果你一定要向上轉(zhuǎn)型担敌,可以“勉強(qiáng)”使用強(qiáng)制類型轉(zhuǎn)換,強(qiáng)制轉(zhuǎn)換為派生類蛀序,但是這樣做是很有問(wèn)題的。
dynamic_cast操作符
向上轉(zhuǎn)型是不安全的,不建議這樣做蒋譬。當(dāng)繼承關(guān)系比較復(fù)雜,或者搞不清繼承關(guān)系時(shí)愉适,可以使用 dynamic_cast 操作符來(lái)保證轉(zhuǎn)型的安全犯助。
dynamic_cast 只允許向下轉(zhuǎn)型,而不允許向上轉(zhuǎn)型维咸。dynamic_cast 只能用在多態(tài)中(也就是有虛函數(shù)的類)也切,因?yàn)樗闅v繼承鏈,確定兩個(gè)類的“父子關(guān)系“腰湾。
請(qǐng)看下面的例子:
#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;
}
運(yùn)行結(jié)果:
Base to Derived is error!
B::display()
dynamic_cast 的使用語(yǔ)法為:
dynamic_cast<目標(biāo)類型>(變量或表達(dá)式);
目標(biāo)類型只能是指針或引用雷恃,下面的用法是錯(cuò)誤的:
B obj;
dynamic_cast(obj);
dynamic_cast 轉(zhuǎn)換成功后會(huì)返回對(duì)象的指針或引用,失敗則返回 null费坊,所以可以通過(guò) if 來(lái)判斷是否轉(zhuǎn)型成功倒槐。
讀者注意:dynamic_cast 的內(nèi)部實(shí)現(xiàn)要依賴于 RTTI,并且會(huì)通過(guò) for 循環(huán)來(lái)遍歷繼承鏈附井,非常低效讨越,能不用則不用两残。