2013-10-19 111 views
0

這如何線工作假設b是從中D1推導並Tell是其在d1定義和以及b類型轉換對象

D1 d1; 
((D1)((B)d1)).Tell(); 
一個虛擬函數的基類
+0

這看起來不正確,因爲C-風格轉換嘗試不同的C++投射在一個訂單,但['dynamic_cast'不是其中之一](http://stackoverflow.com/a/17598055/183120)。 – legends2k

+1

我在你的代碼裏沒有'b'。你的意思是'B'? – jalf

回答

2

它可能無法正常工作,除非D1有一個構造函數從B轉換。如果是這樣的情況下,「工程」通過創建一個臨時的對象,並調用該函數(創建另一個臨時B型之後);這幾乎肯定不是你想要做的。

如果您實際上正在轉換爲指針或引用類型,那麼它將「有效」,如果d1的類型爲D1,因爲轉換互相抵消;但如果它是另一種類型,那麼您將轉換爲錯誤的類型並調用未定義的行爲。

-1

你提到D1從B處產生,但have't提及D1。 假定b是基類& D1,D1都從步驟b &分不清是虛擬衍生,所以它將調用給的主體從D1