c 型別識別及轉換

2021-06-04 01:12:52 字數 2889 閱讀 4605

1. 概念

rtti(run-time type information)即執行時型別識別,c++通過rtti實現對多型的支援。

c++是靜態型別語言,其資料型別是在編譯期就確定的,不能在執行時更改。

為了支援rtti,c++提供了乙個type_info類和兩個關鍵字typeiddynamic_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...