翻了一下發現在 C++ 裡面有一個叫 typeid 關鍵字可以使用,它會傳回一個 type_info 類別,即可從這個類別拿到物件的 type 名稱,使用方法如下
// 假設有 AAA 類別與繼承自 AAA 的 BBB 類別
class AAA
{
};
class BBB : public AAA
{
};
int nObj;
CString strIntType = CString(typeid(nObj).name()); // int
AAA aObj;
CString strAType = CString(typeid(aObj).name()); // class AAA
BBB bObj;
CString strBType = CString(typeid(bObj).name()); // class BBB
AAA* pAObj = new AAA;
CString strPAType = CString(typeid(pAObj).name()); // class AAA *
BBB* pBObj = new BBB;
CString strPBType = CString(typeid(pBObj).name()); // class BBB *
但目前我遇到一個狀況,未經過向下轉型的物件是拿不到正確名稱的,只能拿到上層類別的名稱,例如
AAA* pABObj = new BBB;
CString strPABType = CString(typeid(pABObj).name()); // class AAA *
偏偏這種寫法在很多知名 Design Pattern 都是必要的,我目前只能先透過增加 GetName() Function 來幫助追縱物件型態嘍。
class AAA
{
public:
virtual CString GetName() { return _T("AAA"); };
};
class BBB : public AAA
{
public:
virtual CString GetName() { return _T("BBB"); };
};
AAA* pABObj = new BBB;
CString strPABType = CString(typeid(pABObj).name()); // class AAA *
CString strPABName = pABObj->GetName(); // BBB
Typeid 本來大概就是不可信吧。而且還會因為編譯器的不同而不同。這也是多數c++都提供自己處理rtti的方式。不過基本原理就跟你的作法一樣。。。
回覆刪除了解,謝謝 :D
刪除