2015-11-05 55 views
6

我正在閱讀「C++遊覽」一書,以下段落無法理解。 「不同類型是不可接受的」是什麼意思?那麼,何時使用指針鑄造以及何時使用參考鑄造?有人可以詳細說明這一點嗎?謝謝。何時使用參考dynamic_cast?

編輯: 另一個問題,「Difference in behavior while using dynamic_cast with reference and pointers」問dynamic_cast的行爲,我可以理解 - 返回nullptr或拋出異常。在這個問題中,我問什麼時候使用一個,什麼時候使用另一個。

「我們使用的dynamic_cast當一個指針到一個不同的派生類的一個目的是有效參數的指針類型。然後,我們測試結果是否 是nullptr。這個試驗通常被方便地放置在 。一個變量的在一狀態下的初始化當不同類型的 是不可接受,我們可以簡單的dynamic_cast爲引用類型如果 對象不是所期望的類型,bad_cast被拋出:」 - ℃的遊++ ,4.5.3節

回答

11

基本上,如果我們的目標是允許爲不同類型中的一種,我們可以dynamic_cast的指針,所以我們可以檢查,如果中投得手:

void do_if_derived(Base& b) { 
    Derived* d = dynamic_cast<Derived*>(&b); 
    if (d) { 
     // do something 
    } 
    else { 
     // not a Derived, this is OK 
    } 
} 

,但如果我們的對象必須是一個特定的類型,我們可以dynamic_cast一個參考,讓投丟,如果它恰好是錯誤的:

​​

它是想通過分支或通過一個例外處理失敗案例的問題。

5

「不可接受」只是意味着「不能接受」。具體來說,由你自己的代碼。

您可以使用dynamic_cast<T*>(e)如果你自己的代碼可以處理的情況下*eT型的,通過檢查轉換的結果和做別的事情,如果轉換失敗。

如果e的類型不是T,那麼如果您自己的代碼的執行不能有效繼續,則可以使用dynamic_cast<T&>(e)