2011-07-28 175 views

回答

1

維基百科:

不像一個普通的C風格的類型轉換,類型安全檢查是在運行時進行,如果類型不兼容,一個異常將被拋出(與引用打交道時)或者返回一個空指針(當處理指針時)。

http://en.wikipedia.org/wiki/Dynamic_cast

+1

這不完全正確。當從派生到基礎進行投射時,編譯器幾乎可以肯定地對待'dynamic_cast'和'static_cast'。在運行時檢查發生的唯一時間(以及唯一一次'dynamic_cast'在運行時可能失敗)是在從「Base *」到派生的相反方向進行投射時。 –

+0

謝謝,我不知道。 – azat

3

這不是你的任何一種情況所必需的,因爲這兩個強制轉換不可能失敗。從派生類到基類的轉換總是有效的,不需要轉換。

但是,從基類指針(或引用)強制轉換爲派生類指針(或引用)可能會失敗。如果實際實例不是它所投射到的類,它將失敗。在這種情況下,dynamic_cast爲宜:

Derived d1; 
Base* b = &d1; // This cast is implicit 

// But this one might fail and does require a dynamic cast 
Derived* d2 = dynamic_cast<Derived*> (b); // d2 == &d1 

OtherDerived d3; // Now this also derives from Base, but not from Derived 
b = &d3; // This is implicit again 

// This isn't actually a Derived instance now, so d3 will be NULL 
Derived* d3 = dynamic_cast<Derived*> (b); 
3

的dynamic_cast可以在多重繼承的情況下,用於「向下轉換」和「交叉轉換」。

一些有效的dynamic_cast的例子可以在下面的鏈接中找到:

http://msdn.microsoft.com/en-us/library/cby9kycs%28v=vs.71%29.aspx

但dyanmic_cast不宜經常使用,你應該跳投嘗試用良好的設計,以避免使用dynamic_cast的,相反,多態應爲你而不是dynamic_cast工作。

相關問題