關於C RTTI中typeid()的原理

2021-06-28 22:13:45 字數 606 閱讀 4932

一直不了解c++中如何判斷乙個例項的類別,只知道用typeid()就好,找了好多資料也都是說關於typeid()怎麼用,對於原理很少談到。

於是偶然間我發現了一句話  :

典型的rtti是通過在vtable中放乙個額外的指標來實現的。  

(** 

恍然大悟,於是試驗了一下。

class fa

virtual int get() 

};class son : public fa

};在上面這份**下,由於有虛函式,所以在例項中存在虛函式表指標,

fa* fa = new son();

printf("%s",typeid(*fa).name());

顯示結果 *fa的類別是son;

當我將fa類改為

class fa

//    virtual int get() 

};這時沒有虛函式了,也就是說哪乙個特殊的額外的指標沒有地方放了,

此時結果 *fa的類別顯示是fa;

因此,我猜測當沒有虛函式表指標時,編譯器就靜態處理typeid()函式(因為他根本就沒儲存本例項的具體類別資訊),也就導致了當你沒有虛函式時,typeid()的結果就不再準確。

C 中的typeid關鍵字

typeid是c 中rtti run timetype information,執行時型別識別 機制的組成部分,其目的是根據傳入已有的引數,來判斷引數的資料型別。對於基本資料型別的用法與執行結果 g 6.3.0 include include using namespace std int main...

C RTTI的簡單實現 一

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

C RTTI的簡單實現 二

前不久寫了個 c rtti的簡單實現 一 是在查了一些rtti資料後自己倒騰出來的。近日重看 一兩年前看的忘的東西挺多的 深入淺出mfc 看到候老師關於mfc六個 中的rtti實現,對比了下自己的設計,下面總結一下。整體的巨集定義很類似,乙個靜態變數,乙個虛函式返回真實型別。超級父類的特殊處理。資料...