1. 概念
rtti(run-time type information)即執行時型別識別,c++通過rtti實現對多型的支援。
c++是靜態型別語言,其資料型別是在編譯期就確定的,不能在執行時更改。
為了支援rtti,c++提供了乙個type_info類和兩個關鍵字typeid和dynamic_cast。
type_info :
儲存特點型別的相關資訊,常用來比較物件型別,
type_info類的具體內容由編譯器實現來決定。其宣告如下:
class type_info ;
type_info的建構函式和賦值操作符都為私有,so,不要試圖去定義或複製乙個type_info物件,程式中建立type_info物件的唯一方法是使用typeid操作符
需要特別注意的是,c++標準只是告訴編譯器需要實現type_info::name函式,但是不同的編譯器實現各不相同,這意味著:typeid(int).name()不同編譯器編譯執行後輸出不一樣。
typeid:
typeid表示式形如:typeid(expr);
typeid返回type_info型別,expr可以是各種型別名,物件和內建基本資料型別的例項、指標或者引用,當作用於指標和引用將返回它實際指向物件的型別資訊。
如果表示式的型別是類型別且至少包含有乙個虛函式,則typeid操作符返回表示式的動態型別,需要在執行時計算;否則,typeid操作符返回表示式的靜態型別,在編譯時就可以計算。
當把typeid作用於指標的解引用*p時,若指標p為0,則:如果p指向的型別是帶虛函式的類型別,則typeid(*p)在執行時丟擲乙個bad_typeid異常;否則,typeid(*p)的結果與p的值是不相關的,在編譯時就可以確定
dynamic_cast:
動態型別轉換,執行時型別安全檢查。dynamic_cast會檢查待轉換的源物件是否真的可以轉換成目標型別,這種檢查不是語法上的,而是真實情況的。許多編譯器都是通過vtable找到物件的rtti資訊的,如果基類沒有虛方法,也就無法判斷乙個基類指標變數所指物件的真實型別。
dynamic_cast將乙個指向基類的指標轉換為乙個指向派生類的指標,如果不能正確轉換,則返回空指標。
2. 其它型別轉換符
除了dynamic_cast,標準c++中還有其它三個型別轉換符:static_cast、reinterpret_cast和const_cas。
和dynamic_cast不一樣,其它三個型別轉換符行為都是在編譯期就得以確定的,轉換是否成功,並不依賴被轉換的物件。
const_cast:去掉型別的const或volatile(告訴編譯器不要持有變數的臨時拷貝)屬性。
reinterpret_cast :重新解釋型別,常用於不同型別的指標型別轉換用。
static_cast:類似於c風格的強制轉換,靜態型別轉換。
3.例項
**:
#include #include using namespace std;
struct v_base
};struct v_derived : v_base
;struct base
};struct derived : base
;int main()
v_base* v_pb2 = new v_base();
v_derived *v_pd3 = static_cast(v_pb2); //父類->子類,靜態型別轉換,危險!訪問子類_a成員越界
v_derived *v_pd4 = dynamic_cast(v_pb2); //父類->子類,動態型別轉換,安全的,結果是null
if(v_pd4 == null)
/*//non polymorphic dynamic_cast
base* pb1 = new derived();
derived *pd1 = static_cast(pb1);
derived *pd2 = dynamic_cast(pb1); //編譯錯誤:error: cannot dynamic_cast 『pb1』 (of type 『struct base*』) to type 『struct derived*』 (source type is not polymorphic
if(pd2 == null)
base* pb2 = new base();
derived *pd3 = static_cast(pb2);
derived *pd4 = dynamic_cast(pb2); //編譯錯誤:error: cannot dynamic_cast 『pb2』 (of type 『struct base*』) to type 『struct derived*』 (source type is not polymorphic)
if(pd4 == null)
*/}
gcc編譯,執行輸出:
i is: i
pi is: pi
v_derived is: 9v_derived
*v_pbase is: 9v_derived
same type? true
derived is: 7derived
*pbase is: 4base
same type? false
v_pd4 dynamic_cast failed
RTTI 執行階段型別識別及型別轉換
dynamic cast type name expression 能夠在類層次結構中進行向上轉換 由於is a關係,這樣的型別轉換是安全的 而不允許其他轉換。主要用途是確保可以安全地呼叫虛函式。假設有下述三個類 class grand class superb pubic grand class ...
C 中的型別轉換與型別識別 1
c 基礎內容,不值一提 author jacky wu 2006 4 17 引用該文章,須註明其出處 c 中的型別轉換與型別識別 c 中型別轉換有很多,從簡單的內部型別的自動轉換到複雜的自定義類的型別轉換,以及多型方式的 型別轉換 越來越複雜,讓我等小輩看的是眼花繚亂,不得已,花點時間理清思路,以後...
mysql型別轉換c 型別轉換 C 型別轉換
一 簡介 型別轉換 把資料從一種型別轉換另一種型別 我們要求等號兩邊參與運算子必須型別一致,如果不一致,滿足下列條件會發生自動型別轉換或者隱式型別轉換。1.兩種型別相容 例如 int和double 相容 都是數字型別 2.目標型別大於源型別 double int 顯示型別轉換 1.兩種型別相相容 i...