2017-03-28 35 views
1

當沒有檢查返回值爲NULL時,是否有任何目的使用dynamic_cast?如果我正在查看代碼庫,並且將空值檢查從返回值中省略,那麼使用static_cast可能會如此嗎?使用dynamic_cast而不用空值檢查

A *a = dynamic_cast<A *>(b); 
foo(*a); //might as well have used a static_cast 

我讀過所有的谷歌對此事得到,它似乎是檢查空是唯一的原因,但我還沒有看到任何人站出來說「不dynamic_cast的空檢查浪費週期(RTTI可能導致代碼膨脹)。「

編輯:如果在類型之間存在虛擬繼承,那麼static_cast將失敗,其中dynamic_cast不會。就我而言,情況並非如此。

+0

如果new_type是指向某個類D的指針或引用,並且表達式的類型是指向其非虛擬基B的指針或引用,則static_cast將執行向下轉換。 **如果B不明確,不可訪問,或虛擬基地(或虛擬基地的基地)爲D,則這種向下轉換是不合格的**。這種static_cast不進行運行時檢查,以確保對象的運行時類型實際上是D **,並且只有在通過其他方式保證此前提條件時纔可以安全使用,例如實現靜態多態性。[來源](http://en.cppreference.com/w/cpp/language/static_cast) –

回答

3

當沒有檢查返回值爲NULL時,是否有任何目的使用dynamic_cast?

如果您確定類實例是另一種類型的類型實例,則不可檢查nullptr。在這種情況下爲什麼不使用static_cast?當涉及虛擬繼承時,您可能無法使用static_cast。可以在這個問題的答案中找到詳細信息:Why can't static_cast be used to down-cast when virtual inheritance is involved?

+0

I看到。所以如果在'A'和'B'之間存在虛擬關係,那麼'static_cast'會出現問題,而'dynamic_cast'會是正當的,對嗎?在我的情況下,沒有。 – Opux