回答
不知道Y和X是完全無法解析的。例如,如果Y是int,那麼就是非法的。否則,如果Y是一個多態類的指針,它可能會成功,或者它可能不成立,但它肯定沒有什麼「可能」。最後,這是一個相當討厭的內存泄漏。
的問題應該是:
你能說的
X
的定義和Y
,使下面的代碼是合法的,而且,中投獲得成功嗎?
那麼答案是相當直接:X
必須是一個完整類型爲new
表達是合法的。動態轉換對上傳到非虛擬基地有效,所以如果Y
是指向非虛擬基地的指針(可能是CV限定的,並且包括指向X
本身的指針),則該轉換有效和成功。
此外,在多態性類型(即具有虛擬功能的類)上存在動態強制轉換的其他有效用途。如果X
是多態的,則Y
可以是void *
,或者Y
可以是指向X
的繼承層次結構中的任何其他類的指針。但是,如果Y
是一個指向基地址的指針(但是,這個基地可能是虛擬的!),那麼只有成功。
(本的原因是比任意動態轉換簡單,因爲我們已經知道了動態類型castee的。一般情況下,動態類型轉換可以做更復雜的事情。)
Y應該是指向X的基類的指針。 –
@ööTiib:是的,挺。謝謝! –
這是不正確的。如果'Y'是一個指向基類「X」的指針,那麼'X'不必是多態的。如果'Y'是'void *',演員將會成功(但只有當'X'是多態時纔會合法)。 –
第一,合法,Y
必須是指針類型。所以讓我們 重寫問題爲dynamic_cast<Y cv_qualifiers*>(new X)
。這樣做之後,它的 法律,如果X
是一個完整的類類型,如果任一X
是 多態類型,或Y
是相同的類型X
或者是一個基類 的X
。
如果Y
與X
相同,或者是基類 X
,它將成功。請注意,在這些情況下,dynamic_cast
與static_cast
具有相同的 行爲,實際上對應於 隱式轉換,所以通常只會在沒有任何強制轉換的情況下編寫new X
, 。 (有一些特殊情況,其中 可能是必要的,通常在將結果傳遞給void*
參數時,在這種情況下,我更喜歡 static_cast
,但是這兩種語義在這種情況下完全相同 。)
最後,還有一個特殊的情況下(這也將成功):如果 X
是一個多態類型,Y
是void cv_qualifiers *
。在這種情況下,dynamic_cast
確實具有比static_cast
不同的語義,雖然 由於從new X
返回將具有類型 「指針最派生類型」,實際效果 將是相同的(並且再次,相同的作爲隱含的 轉換)。
雖然靜態演員陣容不適用於虛擬基地! –
@KerrekSB好點。這可能是另一種情況,您可能需要'dynamic_cast'。 –
我覺得'Y'也可以是引用類型。我錯了嗎? –
- 1. vec.erase(vec.end());法律?
- 2. 的dynamic_cast
- 3. Gustafson定律與Amdahl定律
- 4. Benford的Java法律程序
- 5. 爲什麼int * arr = {};法律?
- 6. 法律數據庫列名
- 7. 法律文本的NLP?
- 8. 地圖和法律提及
- 9. Amdahl定律:矩陣乘法
- 10. 使用NAudio揮舞法律?
- 11. string s; &s+1;法律? UB?
- 12. Java法律轉發引用
- 13. Demeter在Java中的法律
- 14. Java:電力法律分配
- 15. C++法律? (類似於三大法則)
- 16. Can not dynamic_cast sideways
- 17. dynamic_cast的性能?
- 18. 不使用dynamic_cast
- 19. dynamic_cast問題xcode
- 20. dynamic_cast失敗
- 21. C++的dynamic_cast
- 22. dynamic_cast的派生
- 23. C++ static_cast vs dynamic_cast
- 24. 避免dynamic_cast/RTTI
- 25. MFC DYNAMIC_DOWNCAST與dynamic_cast
- 26. dynamic_cast出錯
- 27. Can not dynamic_cast
- 28. static_cast vs dynamic_cast
- 29. dynamic_cast和多態性的最佳做法
- 30. 無法使用dynamic_cast與泛型
這應該做什麼? –
它問你'Y'和'X'的哪些類型的組合使這段代碼合法,以及'Y'和'X'的哪些類型的組合使它可能成功。例如,如果'Y'是'X'的基類並且具有虛擬析構函數,則... –