dynamic_cast

(借用部分牛客網友回答)

dynamic_cast<>用於C++類繼承多態間的轉換,分爲:
1.子類向基類的向上轉型(Up Cast)
2.基類向子類的向下轉型(Down Cast)
其中向上轉型不需要藉助任何特殊的方法,只需用將子類的指針或引用賦給基類的指針或引用即可,dynamic_cast、static_cast向上轉型其總是肯定成功的。dynamic_cast是C++爲了保證向下的類型轉化安全而設置的轉化方式

而向下轉換時要特別注意:dynamic_cast操作符,將基類類型的指針或引用安全的轉換爲派生類的指針或引用。dynamic_cast將一個基類對象指針(或引用)cast到繼承類指針,dynamic_cast會根據基類指針是否真正指向繼承類指針來做相應處理。這也是dynamic_cast與其他轉換不同的地方,dynamic_cast涉及運行時類別檢查,如果綁定到引用或指針的對象不是目標類型的對象,則dynamic_cast失敗。如果是指針類型失敗,則dynamic_cast的返回結果爲0,如果是引用類型的失敗,則拋出一個bad_cast錯誤。
注意:dynamic_cast在將父類cast到子類時,父類必須要有虛函數。因爲dynamic_cast運行時需要檢查RTTI信息。只有帶虛函數的類運行時纔會檢查RTTI。

向上轉換一定成功,向下轉換不一定成功。向下轉換必須存在虛函數,不然編譯錯誤

假如集成關係如下:

1

A <- B <- C

變量定義如下:

1

2

3

A *a = new B;  // 本來new了個B,向上轉換爲A,向上轉型不需要藉助任何特殊的方法,總是安全的

B* b = dynamic_cast<B*> (a); // 從A再轉換爲B,因爲本質是B,回到自身,所以成功

C* c = dynamic_cast<C*> (b); // 將本質是B的東西,轉變爲子類對象,所以失敗。即c=0.

更靈活一點:

1

2

3

4

5

A <- B <- C <- D <- E

 

A* a = new C; // a本質是個C

B* b = dynamic_cast<B*> (a); // 成功,因爲B是C的父類

E* e = dynamic_cast<E*> (a); // 失敗,因爲E是C的子類

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章