q1:執行時型別識別(rtti)簡述
• 通過下面兩個操作符實現rtti:
1) typeid 操作符,返回指標或引用所指物件的實際型別
2) dynamic_cast操作符,將基類型別的指標或引用安全的轉換為派生型別的指標或引用
對於帶虛函式的類,在執行時執行rtti操作符,對其他型別,在編譯時計算rtti操作符
q2:dynamic_cast 操作符
• dynamic_cast操作符一次執行兩個操作:驗證,轉換。只有驗證被請求的轉換有效後,才會進行型別轉換
• 如果檢測過程中發現轉換無效,分為以下兩種情況:
1) 若轉換到指標型別失敗,則 dynamic_cast 的結果是 0 值(值為 0 的指標轉換結果也為0)
2) 若轉換到引用失敗,則丟擲乙個 bad_cast 型別的異常
if (derived * derivedptr = dynamic_cast
(basedptr))
else
三個好處:
1) 在 if 內部才會執行派生內操作,在 else 中執行基類操作
2) 保證轉換與結果測試在同乙個表示式中進行
3) 在 if 外部不能訪問該指標
q3:typeid操作符
• typeid(e),此處的 e 是任意表示式或型別名
• 如果運算元不是類型別或是沒有虛函式的類,則typeid操作符指出運算元的靜態型別;若運算元是定義了乙個以上的虛函式的類型別,在執行時計算型別
• 只有當運算元是含有虛函式的類型別物件的時候,才返回動態型別資訊;若測試指標,返回的是指標靜態編譯時型別
○ if( typeid ( *bp) == typeid ( derived )) //正確寫法
○ if ( typeid (bp) == typeid ( derived )) //錯誤寫法,此時判斷 base* 與 derived
• typeid 操作符提供以下幾個操作:
1) t1 == t2;
2) t1 != t2;
3) t.name(); //返回c風格字串,這是型別名字的可顯示版本
4) t1.before(t2); //返回指出 t1 是否出現在 t2 之前的 bool值
執行時型別識別
執行時的型別識別 rtti 分為兩類 1.typeid操作符 2.dynamic cast操作符 先看第二種 dynamic cast完成將基類型別的指標或者引用安全轉化為派生類型別的指標和引用。對於指標,如果轉化失敗,則將指標置為null,對於引用型別,因為沒有null,所以直接丟擲bad cas...
執行時型別識別(RTTI)
執行時型別識別 rtti 即是程式執行過程中知道某個物件屬於某個類,我們平時用c 程式設計接觸的rtti一般是編譯器的rtti,即是在新版本的vc 編譯器裡面選用 使能rtti 然後載入typeinfo.h檔案,就可以使用乙個叫typeid 的運運算元,它的地位與在c 程式設計中的sizeof 運運...
c RTTI(執行時型別識別)
原文 通過rtti,能夠通過基類的指標或引用來檢索其所指物件的實際型別。c 通過下面兩個操作符提供rtti。1 typeid 返回指標或引用所指物件的實際型別。2 dynamic cast 將基類型別的指標或引用安全的轉換為派生型別的指標或引用。對於帶虛函式的類,在執行時執行rtti操作符,返回動態...