2012-12-02 52 views
1

我想知道如何解決這個問題。我不明白這個問題是問我:法律dynamic_cast

dynamic_cast<Y>(new X) 
  • 是合法的?
  • 可能成功嗎?
+2

這應該做什麼? –

+0

它問你'Y'和'X'的哪些類型的組合使這段代碼合法,以及'Y'和'X'的哪些類型的組合使它可能成功。例如,如果'Y'是'X'的基類並且具有虛擬析構函數,則... –

回答

1

不知道Y和X是完全無法解析的。例如,如果Y是int,那麼就是非法的。否則,如果Y是一個多態類的指針,它可能會成功,或者它可能不成立,但它肯定沒有什麼「可能」。最後,這是一個相當討厭的內存泄漏。

3

的問題應該是:

你能說的X的定義和Y,使下面的代碼是合法的,而且,中投獲得成功嗎?

那麼答案是相當直接:X必須是一個完整類型爲new表達是合法的。動態轉換對上傳到非虛擬基地有效,所以如果Y是指向非虛擬基地的指針(可能是CV限定的,並且包括指向X本身的指針),則該轉換有效成功。

此外,在多態性類型(即具有虛擬功能的類)上存在動態強制轉換的其他有效用途。如果X是多態的,則Y可以是void *,或者Y可以是指向X的繼承層次結構中的任何其他類的指針。但是,如果Y是一個指向基地址的指針(但是,這個基地可能是虛擬的!),那麼只有成功

(本的原因是比任意動態轉換簡單,因爲我們已經知道了動態類型castee的。一般情況下,動態類型轉換可以做更復雜的事情。)

+0

Y應該是指向X的基類的指針。 –

+0

@ööTiib:是的,挺。謝謝! –

+0

這是不正確的。如果'Y'是一個指向基類「X」的指針,那麼'X'不必是多態的。如果'Y'是'void *',演員將會成功(但只有當'X'是多態時纔會合法)。 –

3

第一,合法,Y必須是指針類型。所以讓我們 重寫問題爲dynamic_cast<Y cv_qualifiers*>(new X)。這樣做之後,它的 法律,如果X是一個完整的類類型,如果任一X是 多態類型,或Y是相同的類型X或者是一個基類 的X

如果YX相同,或者是基類 X,它將成功。請注意,在這些情況下,dynamic_caststatic_cast具有相同的 行爲,實際上對應於 隱式轉換,所以通常只會在沒有任何強制轉換的情況下編寫new X, 。 (有一些特殊情況,其中 可能是必要的,通常在將結果傳遞給void*參數時,在這種情況下,我更喜歡 static_cast,但是這兩種語義在這種情況下完全相同 。)

最後,還有一個特殊的情況下(這也將成功):如果 X是一個多態類型,Yvoid cv_qualifiers *。在這種情況下,dynamic_cast 確實具有比static_cast不同的語義,雖然 由於從new X返回將具有類型 「指針最派生類型」,實際效果 將是相同的(並且再次,相同的作爲隱含的 轉換)。

+0

雖然靜態演員陣容不適用於虛擬基地! –

+0

@KerrekSB好點。這可能是另一種情況,您可能需要'dynamic_cast'。 –

+0

我覺得'Y'也可以是引用類型。我錯了嗎? –