C RTTI(執行時型別識別)

2021-10-08 18:47:10 字數 3350 閱讀 1927

通過rtti,能夠通過基類的指標或引用來檢索其所指物件的實際型別。c++通過下面兩個操作符提供rtti。

對於帶虛函式的類,在執行時執行rtti操作符,返回動態型別資訊;對於其他型別,在編譯時執行rtti,返回靜態型別資訊。

當具有基類的指標或引用,但需要執行派生類操作時,需要動態的強制型別轉換(dynamic_cast)。這種機制的使用容易出錯,最好以虛函式機制代替之。

dynamic_cast 操作符

如果dynamic_cast轉換指標型別失敗,則返回0;如果轉換引用型別失敗,則丟擲乙個bad_cast型別的異常。

可以對值為0的指標使用dynamic_cast,結果為0。

dynamic_cast會首先驗證轉換是否有效,只有轉換有效,操作符才進行實際的轉換

if

(derived *derivedptr =

dynamic_cast

>

(baseptr)

)else

也可以使用dynamic_cast將基類引用轉換為派生類引用:dynamic_cast(val)

因為不存在空引用,所以不能像指標一樣對轉換結果進行判斷。不過轉換引用型別失敗時,會丟擲std::bad_cast異常。

try

catch

(bad_cast)

typeid操作符

typeid能夠獲取乙個表示式的型別:typeid(e)。

如果運算元不是類型別或者是沒有虛函式的類,則獲取其靜態型別;如果運算元是定義了虛函式的類型別,則計算執行時型別。

typeid最常見的用途是比較兩個表示式的型別,或者將表示式的型別與特定型別相比較。

獲取方法:

type_info:通過typeid,返回乙個type_info

注意:不要將typeid作用於指標,應該作用於引用,或解引用的指標(實現多型的判斷)

#include

#include

using

namespace std;

class

test

;class

testa

:public test};

class

testb

:public test};

intmain()

return0;

}

base *bp;

derived *dp;

// compare type at run time of two objectsif(

typeid

(*bp)

==typeid

(*dp)

)// test whether run time type is a specific typeif(

typeid

(*bp)

==typeid

(derived)

)

注意:如果是typeid(bp),則是對指標進行測試,這會返回指標(bp)的靜態編譯時型別(base *)。

如果指標p的值是0,,並且指標所指的型別是帶虛函式的型別,則typeid(*p)丟擲乙個bad_typeid異常。

rtti的使用

如果有乙個類層次,希望為它實現「==」操作符。假設類層次中只有2個型別,那麼需要4個函式:

bool

operator==(

const base&

,const base&

)bool

operator==(

const derived&

,const derived &

)bool

operator==(

const derived &

,const base&

)bool

operator==(

const base&

,const derived &

)

如果類層次中有4個型別,就要實現16個操作符函式,這種實現就太麻煩了。下面來看如何使用rtti解決這個問題。

只定義1個「==」操作符函式,每個類定義乙個虛函式equal。

class

base

;bool base::

equal

(const base &rhs)

const

class

derived

:public base

;bool derived::

equal

(const base &rhs)

const

else

return

false;}

bool

operator==(

const base &lhs,

const base &rhs)

如果運算元型別不同,操作符就返回假;如果運算元型別相同,就將實際比較運算元的工作委派給適當的虛函式equal。

derived::equal()中的dynamic_cast強制轉換是必要的。因為要比較派生類的成員,必須將運算元base &轉換為derived型別。

type_info類

type_info類的實現因編譯器的不同而不同。但如下幾個常用的操作符和函式是c++標準要求必須實現的:「t1 == t2」、「t1 != t2」、「t.name()」。

typeid操作符的返回型別就是type_info,正因為type_info提供了「==」 操作符,才可以進行上面提到的「if (typeid(*bp) == typeid(*dp))」判斷。

type_info的預設建構函式、拷貝建構函式、賦值操作符都定義為private,建立type_info物件的唯一方法就是使用typeid操作符。

name()函式返回型別名字的c-style字串,但字串的格式可能不同的編譯器略有不同。下面是在vc2008編譯器下的測試。

// expre_typeid_operator.cpp

// compile with: /gr /ehsc

#include

#include

class

base};

class

derived

:public base

;using

namespace std;

intmain()

c RTTI(執行時型別識別)

原文 通過rtti,能夠通過基類的指標或引用來檢索其所指物件的實際型別。c 通過下面兩個操作符提供rtti。1 typeid 返回指標或引用所指物件的實際型別。2 dynamic cast 將基類型別的指標或引用安全的轉換為派生型別的指標或引用。對於帶虛函式的類,在執行時執行rtti操作符,返回動態...

c RTTI(執行時型別識別)

通過rtti,能夠通過基類的指標或引用來檢索其所指物件的實際型別。c 通過下面兩個操作符提供rtti。1 typeid 返回指標或引用所指物件的實際型別。2 dynamic cast 將基類型別的指標或引用安全的轉換為派生型別的指標或引用。對於帶虛函式的類,在執行時執行rtti操作符,返回動態型別資...

執行時型別識別

執行時的型別識別 rtti 分為兩類 1.typeid操作符 2.dynamic cast操作符 先看第二種 dynamic cast完成將基類型別的指標或者引用安全轉化為派生類型別的指標和引用。對於指標,如果轉化失敗,則將指標置為null,對於引用型別,因為沒有null,所以直接丟擲bad cas...