2009-11-27 42 views
0

我讀了幾篇關於使用靜態和動態演員的專題文章When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?以下C++轉換是否正確?

我對以下方式使用演員表有疑問。有人可以驗證下面提到的代碼: -

這是在繼承層次向上鑄造

template<class Base, class Derived> 

inline Handle<Base> STATIC_CAST(Handle<Derived> hd) { 

    Handle<Base> hb; 

    Derived* dp = hd.get(); // Assume this gives pointer of derived class object 

    Base* bp = static_cast<Base*> (dp); 

    if(bp) { 

    hb = Ptr2Handle(bp); // Assume this give reference to Handle 

    } 

    return hb; 

} 

*衍生實際上是從基類派生類。

在下面的代碼中向下投射如何?

template<class Base, class Derived> 

inline Handle<Derived> DYNAMIC_CAST(Handle<Base> hb) { 

    Handle<Derived> hd; 

    Base* bp = hb.get(); 

    Derived* dp = dynamic_cast<Derived*> (bp); 

    if(dp) { 

    hd = Ptr2Handle(dp); 

    } 

    return hd; 

} 

如果上述兩個MACROS通過Base和Derived類交換傳遞,會有什麼影響?

+0

是基礎派生的相關類型嗎? – Naveen 2009-11-27 17:49:53

回答

4

如果Base確實是Derived的基類,則絕對不需要任何類型轉換,這意味着在上面的代碼中static_cast是絕對多餘的。它沒有實現任何僅僅指派不會隱含的任何事情。此外,在upcasts(從派生到基地),dynamic_cast是絕對等於static_cast,這意味着dynamic_cast也不會實現任何新的。

實際上,通過在該代碼中放置一個明確的static_cast強制轉換,其作者啓用強制「反向」強制轉換(向下轉換)。即您可以使用此代碼從基類轉換爲派生類。我不知道這是否是這個意圖(我懷疑它是由模板參數名稱來判斷的),如果不是這樣,那麼完全刪除演員陣列可能是一個好主意,因爲它很危險。

如果,儘管我懷疑,代碼實際上應該支持downcasts,然後dynamic_cast可能確實有助於捕獲潛在的錯誤。但是請記住,dynamic_cast僅適用於具有多態類類型的向下轉換。

+0

是的。如果有人將參數Base和Base的Derived類傳遞給參數Derived,那麼這將很有趣。 – Naveen 2009-11-27 18:01:49

+0

好玩嗎?你能解釋一下這個影響嗎? – chrisgayle 2009-11-27 18:14:19

+0

影響是,如果'Derived'實際上是從'Base'派生出來的,你可以反向傳遞它們(作爲派生的base和base派生),函數什麼都不會說 - 它只是悄悄地做一個unchecked downcasts。如果事實證明'Base'指針並不是真的指向'Derived'實例,那麼這個downcast的結果就沒有意義了。然而,你的功能不會說什麼。如果你只想把你的功能用於upcasts,不要做任何明確的轉換。 – AnT 2009-11-27 18:19:24

0

層次結構中向上(在祖先方向上)的static_cast始終是合法的。該演員將是合法的(假設Base和Derived是類)iff Base是Derived的基類。

0

假設Derived是從Base派生的,儘管正確是不必要的。您可以直接將hd.get()的結果分配給Base*