是什麼一個基類指針分配派生類中的這兩種方式之間的區別?
Derived d1;
Base *b1 = &d1
Derived d2;
Base *b2 = dynamic_cast<Base*> &d2
是什麼一個基類指針分配派生類中的這兩種方式之間的區別?
Derived d1;
Base *b1 = &d1
Derived d2;
Base *b2 = dynamic_cast<Base*> &d2
維基百科:
不像一個普通的C風格的類型轉換,類型安全檢查是在運行時進行,如果類型不兼容,一個異常將被拋出(與引用打交道時)或者返回一個空指針(當處理指針時)。
首先一個是顯式的轉換,其是一個的static_cast。對於區別,你可以參考:http://www.cplusplus.com/doc/tutorial/typecasting/
這不是你的任何一種情況所必需的,因爲這兩個強制轉換不可能失敗。從派生類到基類的轉換總是有效的,不需要轉換。
但是,從基類指針(或引用)強制轉換爲派生類指針(或引用)可能會失敗。如果實際實例不是它所投射到的類,它將失敗。在這種情況下,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);
的dynamic_cast可以在多重繼承的情況下,用於「向下轉換」和「交叉轉換」。
一些有效的dynamic_cast的例子可以在下面的鏈接中找到:
http://msdn.microsoft.com/en-us/library/cby9kycs%28v=vs.71%29.aspx
但dyanmic_cast不宜經常使用,你應該跳投嘗試用良好的設計,以避免使用dynamic_cast的,相反,多態應爲你而不是dynamic_cast工作。
這不完全正確。當從派生到基礎進行投射時,編譯器幾乎可以肯定地對待'dynamic_cast'和'static_cast'。在運行時檢查發生的唯一時間(以及唯一一次'dynamic_cast'在運行時可能失敗)是在從「Base *」到派生的相反方向進行投射時。 –
謝謝,我不知道。 – azat