RTTI 執行階段型別識別及型別轉換

2021-06-26 09:33:12 字數 2287 閱讀 7018

dynamic_cast< type-name > (expression)
能夠在類層次結構中進行向上轉換(由於is-a關係,這樣的型別轉換是安全的),而不允許其他轉換。主要用途是確保可以安全地呼叫虛函式。

假設有下述三個類:

class grand;

class superb:pubic grand;

class magnificent:public superb;

指標

grand *pg = new grand;

grand *ps = new superb;

grand *pm = new magnificent;

最後,對於下面的型別轉換;

magnificent* p1 = (magnificent*) pm; //#1

magnificent* p2 = (magnificent*) pg; //#2

superb* p3=(magnificent*) pm; //#3

#1 安全;pm原本即為magnificent類

#2 不安全;基類不能賦給派生類

#3 安全;派生類可賦給基類

注意: 通常,如果指向的物件(*pt)的型別為type或者是從type直接或間接派生而來的型別,則下面的表示式將指標pt轉換為type型別的指標:

dynamic_cast(pt)
否則,結果為0,即為空指標;

如果pg指向的是乙個magnificent物件,則下述表示式的結果為bool值true,否則為false;

typeid(magnificent)==typeid(*pg)
type_info類的實現隨廠商而異,但包含乙個name()成員,該函式返回乙個隨實現而異的字串:通常(但並非一定)是類的名稱。

cout<<"now processing type "<(expression)
除了const或volatile特徵(有或無)可以不同外,type_name和expression的型別必須相同。假設high和low是兩個類:

high bar;

const high* cbar=&bar;

...high* pb=const_cat(cpbr); //valid

const low* pl=const_cast(cbar) //valid

第乙個型別轉換使得*pb 成為乙個可用於修改bar物件值的指標,它刪除const標籤。第二個型別轉換是非法的,因為它同時嘗試將型別從const high* 改為const low*。

提供該運算子的原因是,有時候可能需要這樣乙個值,他在大多數時候是常量,而有時又是可以修改的。在這種情況下,可以將這個值宣告為const,並在需要修改它的時候,使用const_cast。通用轉換也可以實現:

high bar;

const high* cbar=&bar;

...high* pb=(high*)(cpbr); //valid

low* pl=(low*)(cbar) //also valid

由於程式設計時可能無意間同時改變型別和常量特徵,因此使用const_cast運算子更安全。

static_cast(expression)
僅當type_name可被隱式轉換為expression所屬的型別或expression可被隱式轉換為type_name所屬的型別時,上述轉換才是合法的,否則將出錯。假設high是low的基類,而pond是乙個無關的類,則從high到low的轉換、從low到high的轉換都是合法的,而從low到

pond的轉換是不允許的:

high bar;

low blow;

...high* pb = static_cast(&blow); //valid upcast

low* pl = static_cast(&bar); //valid downcast

pond* pmer = static_cast(&blow); //invalid,pond unrelated

第一種轉換是合法的,因為向上轉換可以顯示地進行。第二種轉換是從基類指標到派生類指標,在不進行顯式型別轉換的情況下,將無法進行。

可以用static_cast將整型轉換為列舉值。同樣可以用static_cast將double轉換為int,將float轉換為long以及其他各種數值轉換。

RTTI 執行階段型別識別

rtti是執行階段型別識別 c 有3個支援rtti的元素 dynamic cast 如可能,使用乙個指向基類的指標生成派生類指標,否則返回空指標 typeid 返回乙個指出物件型別的值 type info 結構儲存了有關特定型別的資訊 只能將rtti用於包含虛函式的類層次結構 dynamic cas...

RTTI 執行階段型別識別

rtti是執行階段型別識別 c 有3個支援rtti的元素 dynamic cast 如可能,使用乙個指向基類的指標生成派生類指標,否則返回空指標 typeid 返回乙個指出物件型別的值 type info 結構儲存了有關特定型別的資訊 只能將rtti用於包含虛函式的類層次結構 dynamic cas...

執行時型別識別(RTTI)

執行時型別識別 rtti 即是程式執行過程中知道某個物件屬於某個類,我們平時用c 程式設計接觸的rtti一般是編譯器的rtti,即是在新版本的vc 編譯器裡面選用 使能rtti 然後載入typeinfo.h檔案,就可以使用乙個叫typeid 的運運算元,它的地位與在c 程式設計中的sizeof 運運...