RTTI in C++

 

RTTI(Runtime Type Identification/Information)

 

如果要實現運行時的RTTI,必須在類中加入一些唯一識別信息,靜態成員變量則提供了這樣一種方法。對於類而言,靜態成員的地址信息是唯一確定的,這樣就可以設計一種實現RTTI的方法。

 

1. typeid and dynamic_cast

標準C++中定義了type_info這個類用來表示對象的類型信息,同時增加了typeid運算符來取得類型信息。typeid()一個對象或者類型名作爲參數,返回一個匹配的const type_info對象來表明對象的確切類型。type_info常用的3個成員函數爲operator ==()、operator !=()和name(),請參考標準頭文件<typeinfo>。

對於“Class obj;”而言,typeid(obj)返回一個type_info對象的引用,而typeid(Class)返回一個type_info對象。

在多態類型(即帶virtual函數的類)中,typeid()可以實現類似virtual函數動態綁定的功能,此時可以將typeid()看作是一個virtual函數。

除多態類型外,typeid()同樣可以用來獲得非多態類型對象基本數據類型對象的類型信息。

注:typeid只能取得類型信息,而無法檢查類間的繼承關係,雖然它有類似虛函數動態綁定的功能。typeid的功能和下面講述的RUNTIME_CLASS宏、GetRuntimeClass()函數在原理上類似。

如果要判斷類之間的繼承關係,則需要用到dynamic_cast<>這個算符。dynamic_cast實現類似下面提到的IsDerivedFrom()這個函數的功能。

 

2. RTTI in MFC

MFC中的RTTI實現方法和標準C++中應該是類似的,但MFCC++標準中引入RTTI的時間要早,所以MFC提供了自己的一套方式。這裏有一個模擬,比MFC中提供的要簡單一些。(暫不提供一步步的設計過程,以後再加。

補充:CRuntimeClass只是用來表示類型信息,而不是運行時類型信息(RTTI),將類繼承關係中的各個CRuntimeClass對象組織起來,並使用IsDerivedFrom函數來判斷繼承關係,纔是實現RTTI的核心所在。

 

 

 

 

兩種實現方式的對比

 

標準C++

MFC

類型信息結構

type_info

CRuntimeClass

取得類型信息

typeid()

RUNTIME_CLASS()

GetRuntimeClass()

判斷繼承關係

dynamic_cast<>

IsDerivedFrom()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章