2011-06-04 82 views
-4

下面的代碼的執行產生這樣的輸出:的dynamic_cast

1 is a null pointer 
2 is not a null pointer 

代碼

class base {}; 
class derived1: public base {}; 
class derived2: public base {}; 

int main() { 
    base *baseptr[1]; 
    baseptr[0] = new derived2; 
    derived1 *derptr = new derived1; 
    derived1 *derivedptr1 = dynamic_cast<derived1*>(baseptr[0]); 
    derived1 *derivedptr2 = dynamic_cast<derived1*>(derptr); 
    cout<<((derivedptr1==0)?"1 is null pointer":"1 is not a null pointer") << endl; 
    cout<<((derivedptr2==0)?"2 is null pointer":"2 is not a null pointer") << endl; 
} 

爲什麼derivedptr2僅初始化和derivedptr1是不是?因爲兩者都有一個有效的右手邊值。這是否與動態演員有關,並且在第二種情況下,我將derived1 *轉換爲derived1 *?

+2

請首先解釋一下您對輸出的疑惑或奇怪。 – 2011-06-04 05:12:04

+0

爲什麼在標題中包含'static_cast',實際問題甚至沒有提到'static_cast'? – AnT 2011-06-04 05:27:42

回答

1

* dynamic_cast *用於檢查downcast的有效性。
如果指針實際指向要被轉換的類型或從指向的類派生的類,它將返回一個有效的指針。

baseptr[0]指向類型derived2

隨着

dynamic_cast<derived1*>(baseptr[0]); 

您試圖檢查basepte[0]實際上指向derived1或從它派生的類。很明顯,它既不會返回0

相似,derptr指向derived1類型。

隨着

dynamic_cast<derived1*>(derptr); 

您試圖檢查derptrderived1,這是正確的,因此它返回一個有效的指針類型,從而導致打印到NOT NULL。

一個警告:作爲@AndreyT正確地指出dynamic_cast僅適用於Polymorphic類!

3

首先,你的代碼是不可編譯的。爲了將dynamic_cast用於upcast之外的其他任何事情,您需要一個多態類型作爲指針操作數。你正在使用它來進行[試圖]十字架,而你的類型不是多態的。其次,如果你讓你的類變多態(以便代碼編譯),那麼你報告的行爲真的是預期的行爲。 derivedptr1指針應該確實爲空,因爲derived2對象不是derived1對象(並且所討論的對象不是任何常見超級對象的組成部分)。交叉轉換失敗,因此dynamic_cast評估爲空指針。你還期望別的嗎?

在第二種情況下(對於derivedptr2),您有一個derived1 *derived1 *的「身份」。類型是相同的,所以這個演員陣容基本上是沒有任何操作的。它只是評估到原始值。