一直不了解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實現,對比了下自己的設計,下面總結一下。整體的巨集定義很類似,乙個靜態變數,乙個虛函式返回真實型別。超級父類的特殊處理。資料...