向上轉(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)來遍歷繼承鏈,非常低效,能不用則不用。