C RTTI的簡單實現 二

2021-08-01 03:19:32 字數 1453 閱讀 7803

前不久寫了個 c++ rtti的簡單實現(一) ,是在查了一些rtti資料後自己倒騰出來的。近日重看(一兩年前看的忘的東西挺多的)《深入淺出mfc》,看到候老師關於mfc六個**中的rtti實現,對比了下自己的設計,下面總結一下。

整體的巨集定義很類似,乙個靜態變數,乙個虛函式返回真實型別。超級父類的特殊處理。

資料結構

mfc中用的是單鏈表,採用頭插法建立鍊錶。結構體內有三個指標:乙個靜態頭指標,乙個next指標,還有乙個指向父類的指標。本人用的樹形結構。乙個父指標,乙個兄弟指標,乙個孩子指標。我的結構體設計的稍微囉嗦了一些。不過多出來的資訊在某些情況下也是有用的,比如可以列出a類的所有派生類,並按照層次列出(覺得有用的可討論)。

對映表

我的設計中有一張key為類名(字串),value為類的runtimeclass位址的對映表,以此來定位某類在鍊錶中的位置。mfc中用了頭指標來訪問鍊錶。這一點不能說我的設計和mfc比沒有一點優勢,空間換時間嘛,在dynamic_cast的我這種實現會快一些,少一些搜尋時間。

細節

在實現鏈結的時候,mfc用的是結構體的建構函式,我是用的模板函式,本質原因還是資料結構上的差異。另外mfc上的可以實現動態建立。我也進行一下修改,支援動態建立功能。

改下結構體

class shape;

////繼承鏈結構體定義/////

typedef struct tagrtti_treertti_tree;

插入構造**

///構造rtti id

#define my_rtti(class_name) \

public: \

static rtti_tree s_rttinode; \

static shape* createobj() \ //+

virtual

const

char * typeid()

//構造繼承鏈 超級父親

template

rtti_tree rtti_create_link(const

char *pname)

`//構造繼承鏈 普通類

template

rtti_tree rtti_create_link(const

char *pname)

//對映表,索引整棵樹

string str(pname);

g_rtti_map[str]=&(mt::s_rttinode);

return t;

}

shape* load(const

char *str)else

}int main()

C RTTI的簡單實現 一

為了加深對rtti的理解,嘗試實現了乙個rtti系統。不過做的比較簡陋,功能如下 typeid的識別利用虛函式實現,利用虛函式的性質可以讓物件輸出真正的型別標誌,而不會被其宣告的型別所改變。為了安全的造型,實現了乙個繼承鏈。在系統內,每個類的宣告裡會加上乙個s rttinode,用於儲存繼承資訊,包...

關於C RTTI中typeid()的原理

一直不了解c 中如何判斷乙個例項的類別,只知道用typeid 就好,找了好多資料也都是說關於typeid 怎麼用,對於原理很少談到。於是偶然間我發現了一句話 典型的rtti是通過在vtable中放乙個額外的指標來實現的。恍然大悟,於是試驗了一下。class fa virtual int get cl...

棧的簡單實現(二)

上文棧的簡單實現 一 實現了不能擴充套件棧容量的順序棧結構,這次給棧加上擴容功能,這樣就不用擔心出現滿棧的情況了。不過由於本人技術水平不夠,也還在學習當中,因此只能固定擴大大小,而不是根據實際情況進行最合適的擴大。跟上文 差不多,只是新增了乙個擴容的方法,以及改變了push方法。新增 如下 擴大棧的...