2014-01-09 67 views
-1

我有一個非常普遍的問題,在C++中的dynamic_cast相關: 假設我們有以下類別:dynamic_cast的派生

class Father{ 
public: 
     Father(...); // this is constructor 
     //..... 
     //.. Whatever code in here, not important 
     ~ Father(); //destructor 
protected: 
     // some protected variables 
} // end of class Father 


class Son:public Father { 
public: 
     Son(...); // this is cnostructor 
     //..... 
     //.. Whatever code in here, not important 
     ~ Son(); //destructor 
protected: 
     // some protected variables 
} // end of class Son 


class Another{ 
public: 
     Another(...); // this is constructor 
     //..... 
     //.. Whatever code in here, not important 
     ~ Another(); //destructor 

     AnotherMethod(Father* fatherOpj,......) // 

} // end of class Another   

而且我們說的方法「AnotherMethod」做下一個:

AnotherMethod(Father* fatherOpj,......) 
    { 
     Son *sonObj = dynamic_cast<Son*>(fatherOpj); 
    // using sonObj 
    } 

雖然在主,我們做以下幾點:

Son* son1=Null; 
    //... 
    son1 = new Son(.....); 
//.... 
    AnotherMethod(son1,....); 

現在,我想知道下一個問題:那樣 - 當我們用一個Son *類型的指針調用AnotherMethod時,在它的簽名中有父親* - 我們將失去兒子(哪個父親沒有)的字段/成員 或者做dynamic_cast我們將能夠擁有它們(在它們內部有正確的值)?!

+1

您將能夠使用'son'的數據成員和成員函數'sonObj-> x'。但是,除非這是一個人爲的例子,否則「兒子」可能不應該來自「父親」。另外請注意,你並沒有檢查'dynamic_cast'是否返回了一個空指針。 – Simple

+1

請注意,如果沒有至少一個虛函數(通常是基類析構函數),'dynamic_cast'將不起作用。 – Sean

+0

@Simple在我自己的代碼中,我只在確實知道我得到的參數(father * fatherOpj)是一個兒子*的情況下才執行轉換,在這種情況下,是否存在空值? – user2750466

回答

3

如果指針確實指向一個Son對象(即動態類型Son,而靜態類型Father),則所有的Son字段都在那裏,並且鑄造指針後訪問。

如果它不指向Son,那麼轉換將會失敗,給出一個空指針。

請注意,dynamic_cast只有在Father是多態時才起作用 - 也就是說,如果它聲明瞭至少一個虛函數。在你的例子中,它不是多態的,所以演員陣容將失敗。

+0

如果析構函數被聲明爲虛擬的呢?演員會成功嗎? – user2750466

+1

@ user2750466:是的,包括析構函數在內的任何虛函數都會使其變爲多態。 –

+0

如果我只在確實知道它指向兒子時才進行演員,那麼動態演講會有害嗎?我應該在這種情況下做靜電嗎?或者兩者都可以工作? – user2750466

1

將我們失去的字段/成員的兒子

不,你不能從指針訪問它Father

通過執行dynamic_cast的,我們將能夠讓他們(裏面他們正確 值)

是的,你會的,因爲它仍然是一個Son對象(如果被傳遞的對象有Son型, 當然)。