在揭開typeid神秘面紗之前,我們先來了解一下
rtti
(run-time type identification,執行時型別識別),它使程式能夠獲取由基指標或引用所指向的物件的實際派生型別,即允許「用指向基類的指標或引用來操作物件」的程式能夠獲取到「這些指標或引用所指物件」的實際派生型別。在c++中,為了支援rtti提供了兩個操作符:dynamic_cast和typeid。
dynamic_cast允許執行時刻進行型別轉換,從而使程式能夠在乙個類層次結構中安全地轉化型別,與之相對應的還有乙個非安全的轉換操作符static_cast,因為這不是本文的討論重點,所以這裡不再詳述,感興趣的可以自行查閱資料。下面就開始今天我們的話題:typeid。
typeid
是c++的關鍵字之一,等同於sizeof這類的操作符。typeid操作符的返回結果是名為
type_info
的標準庫型別的物件的引用(在標頭檔案typeinfo中定義,稍後我們看一下vs和gcc庫裡面的原始碼),它的表示式有下圖兩種形式。
如果表示式的型別是類型別且至少包含有乙個虛函式,則typeid操作符返回表示式的動態型別,需要在執行時計算;否則,typeid操作符返回表示式的靜態型別,在編譯時就可以計算。
iso c++標準並沒有確切定義type_info,它的確切定義編譯器相關的,但是標準卻規定了其實現必需提供如下四種操作(在之後的章節中我會來分析type_info類檔案的原始碼):
t1 == t2
如果兩個物件t1和t2型別相同,則返回true;否則返回false
t1 != t2
如果兩個物件t1和t2型別不同,則返回true;否則返回false
t.name()
返回型別的c-style字串,型別名字用系統相關的方法產生
t1.before(t2)
返回指出t1是否出現在t2之前的bool值
type_info類提供了public虛 析構函式,以使使用者能夠用其作為基類。它的預設建構函式和拷貝建構函式及賦值操作符都定義為private,所以不能定義或複製type_info型別的物件。程式中建立type_info物件的唯一方法是使用typeid操作符(由此可見,如果把typeid看作函式的話,其應該是type_info的 友元)。type_info的name成員函式返回c-style的字串,用來表示相應的型別名,但務必注意這個返回的型別名與程式中使用的相應型別名並不一定一致(往往如此,見後面的程式),這
具體由編譯器的實現所決定
的,標準只要求實現為每個型別返回唯一的字串。
上面的都是一些理論的東西,看不真切,下面將通過**和圖例來展示。
#include using namespace std;
class base {};
class derived: public base {};
int main()
; };
/*...*/
cout
<<
typeid(pb2).name()
<<
endl//輸出base *
<< typeid(b2).name()
這次base含有虛函式,注意看結果,指標仍然是base*的,儘管他們指向的是底層物件derived,而這些base物件的型別卻是derived的。
因為指標pb3不是類型別,所以typeid就返回該指標pb3的指標型別base *。而*pb3是乙個類型別的表示式,而且該類帶有虛函式,所以指出該pb3指向的底層物件的型別derived。
如果typeid操作符的運算元是至少包含乙個虛函式的類型別時,並且該表示式是乙個基類的應用,則typeid操作符指出底層物件的派生類型別。
好了,文篇到此結束,留下幾道小題目吧。 //
採用v8環境
cout<
C 中的typeid關鍵字
typeid是c 中rtti run timetype information,執行時型別識別 機制的組成部分,其目的是根據傳入已有的引數,來判斷引數的資料型別。對於基本資料型別的用法與執行結果 g 6.3.0 include include using namespace std int main...
執行時型別識別
執行時的型別識別 rtti 分為兩類 1.typeid操作符 2.dynamic cast操作符 先看第二種 dynamic cast完成將基類型別的指標或者引用安全轉化為派生類型別的指標和引用。對於指標,如果轉化失敗,則將指標置為null,對於引用型別,因為沒有null,所以直接丟擲bad cas...
執行時型別檢查
執行時型別資訊 run time type information 通常記做rtti。在c primer第五版中,譯作執行型別識別 run time type identification 執行時型別資訊包括三部分 1 乙個運算子dynamic cast,給它乙個指向某某物件的基類指標,它能得到乙個...