2008-08-26 69 views

回答

0

我目前的玩具項目使用dynamic_cast兩次;曾經爲解決缺乏C++中的多次調度問題(這是一個訪問者風格的系統,可以使用多個調度而不是dynamic_casts),並且一次特殊情況下特定的子類型。

在我看來,這些都是可以接受的,儘管前者至少源於語言缺陷。事實上,我認爲這可能是一種常見的情況;大多數dynamic_casts(以及大量的「設計模式」)是針對特定語言缺陷的解決方法,而不是針對某些特定語言缺陷的解決方案。

0

通過C接口將句柄暴露給對象時,它可用於運行時類型安全位。讓所有公開的類從一個公共基類繼承。當接受函數的句柄時,首先將其轉換爲基類,然後將其動態轉換爲您期望的類。如果他們傳遞了一個非感性的句柄,那麼當運行時找不到rtti時會得到異常。如果他們傳入錯誤類型的有效句柄,則會得到一個NULL指針,並可能拋出自己的異常。如果他們通過正確的指針,你很好走。 這不是傻瓜,但它肯定比捕獲錯誤的調用庫更好,而不是直接從句柄重新解釋,並且等到某些數據在通過錯誤的句柄時被神奇地破壞。

1

這是我經常做的事情,雖然不太好,但它很簡單而且有用。

我經常和實現接口的模板,集裝箱工作, 想象像

template<class T> 
class MyVector : public ContainerInterface 
... 

凡ContainerInterface已基本有用的東西,但僅此而已。如果我想在不暴露我的模板實現的情況下使用整數向量的特定算法,那麼在實現中接受接口對象並將其dynamic_cast接受到MyVector是非常有用的。例如:

// function prototype (public API, in the header file) 
void ProcessVector(ContainerInterface& vecIfce); 

// function implementation (private, in the .cpp file) 
void ProcessVector(ContainerInterface& vecIfce) 
{ 
    MyVector<int>& vecInt = dynamic_cast<MyVector<int> >(vecIfce); 
    // the cast throws bad_cast in case of error but you could use a 
    // more complex method to choose which low-level implementation 
    // to use, basically rolling by hand your own polymorphism. 

    // Process a vector of integers 
    ... 
} 

我可以添加一個Process()方法,將多態解決ContainerInterface,這將是一個更好的方法,面向對象,但我有時喜歡做這種方式。當你有簡單的容器,很多算法,並且你想隱藏你的實現時,dynamic_cast提供了一個簡單和醜陋的解決方案。

你也可以看看雙派遣技巧。

HTH

0

那麼它真的會很好用C#中的擴展方法。

例如,假設我有一個對象列表,我想從它們中獲取所有id的列表。我可以逐步通過它們並將它們拉出來,但我想分割出這些代碼以供重用。

所以像

List<myObject> myObjectList = getMyObjects(); 

List<string> ids = myObjectList.PropertyList("id"); 

會除了在擴展方法,你不會知道,在未來的類型涼爽。

所以

public static List<string> PropertyList(this object objList, string propName) { 
    var genList = (objList.GetType())objList; 
} 

將是真棒。

9

這個最近的線程給出了它派上用場的一個例子。有一個基本的Shape類和從它派生的類Circle和Rectangle。在測試平等時,很顯然Circle不能等於Rectangle,試圖比較它們將是一場災難。在遍歷指向Shapes的指針集合時,dynamic_cast會執行雙重任務,告訴您形狀是否可比,併爲您提供適當的對象以進行比較。

Vector iterator not dereferencable

0

這是非常有用的,但是,大多數的時候是有用:如果完成工作的最簡單的方法是做一個dynamic_cast的,它往往比的不是症狀糟糕的OO設計,反過來又可能以未知的方式導致未來的麻煩。