2011-09-03 62 views
2

我試圖擴展一些我無權訪問的類的功能。基類和派生類的運行時類型信息

基本上我試圖爲記錄目的創建一個toString/toXML方法。我想創建一個單身人士(本質上是一張地圖),我可以註冊不同的功能,並以全球可用的方式提供這些功能,所以我可以擁有像string Singleton::toString(void* or abstractObject*)這樣的東西,它可以根據類型從地圖中選擇正確的方法。

儘管我可以通過typeid獲取類型信息,但我希望能夠爲基類實現它,然後讓所有派生類都使用該方法,除非我有更接近/更合適的方法。

這是可能的,或者我應該改變爲不同的方法(可以模板做到這一點)?不幸的是,我無法訪問這些類,因爲它們大多數來自第三方庫。

+0

如果他們在第三方庫會怎樣'abstractObject *'幫你? 'abstractObject'是否已經作爲一個類型存在? – Flexo

+0

大多數庫來自(各自的)基礎對象。我更喜歡一個通用的解決方案,但是如果通過庫/基礎對象進行分裂使其成爲可能,那麼這可能是一種可行的方法,儘管這是一個不好的解決方案。 – Darcara

+0

大多數類(甚至是第三方)都通過'operator <<'進行序列化。嘗試使用這個,看看它是否打印到流中。 –

回答

0

我發現以下是一個非常簡單的方法,用於跟蹤我定義的基類和派生結構或類的類型。

_kind不一定是一個字符串。實際上,它可能應該是一個枚舉。但是,由於我在設計一個相當高層次的程序時,對於我來說,字符串足夠快。

struct base 
{ 
protected: 
    string _kind; 
public: 
    base() 
    { 
     _kind = "base"; 
    } 

    ~base() 
    { 
    } 

    string kind() 
    { 
     return _kind; 
    } 
} 
struct derived : base 
{ 
    derived() 
    { 
     _kind = "derived"; 
    } 
    ~derived() 
    { 
    } 
} 

對於內置結構,可能重載了toString和toXML方法,並讓編譯器決定?

string toString(structure1 A) 
{ 
... 
} 
string toString(structure2 A) 
{ 
... 
} 

這可能會派生結構有點混亂,但我認爲,編譯器會選擇葉結構的類型,而不是基地。例如,如果您有類型A:B:C:D,並且爲C和A定義了函數f。如果輸入了B類型的變量,則它應該被自動類型化爲A.如果輸入一個C類型的變量,那麼它將使用類型C的函數。如果你輸入了一個D類型的變量,那麼它應該被自動類型化爲C,然後應該調用C函數。

你也可以嘗試基本上做同樣事情的模板。

template <class t> 
string toString(t A) 
{ 
... 
} 

乾杯, 斯內德