一般來說我們盡量使用虛函式來進行動態型別繫結,但是我們想使用基類物件的指標或引用執行某個派生類操作並且該類不是虛函式時,我們要動態區分類物件的型別。
以下是接管型別管理的方法,實現動態型別識別的方法有三種:
實現方式:
在基類中定義虛函式,返回具體的型別資訊
所有的派生類都必須實現型別相關的虛函式
每個類的虛函式都必須有不同的實現以進行型別區別
缺點:必須從基類開始提供型別虛函式
所有的派生類都必須重寫型別虛函式
每個派生類的型別id必須唯一
優點:不用顯示的宣告和定義型別虛函式
不用為類族中的每個類分配型別id
缺點:只能用於具有虛函式的類族
typeid關鍵字返回對應引數的型別資訊
typeid返回乙個type_info類物件
當typeid的引數為null時,丟擲bad_typeid異常
type_info類的使用需要包含
c++中可以通過多型的方式進行動態型別識別
dynamic_cast關鍵字是可用於動態型別識別
typeid關鍵字在c++中專用於動態型別的識別
最後以c++ primer一句話結束:使用rtti必須加倍小心。在可能的情況下,最好定義虛函式而非直接接管型別管理的重任。
#include #include using namespace std;
// way 1 多型機制
class parent
enum ;
};class child :public parent
enum ;
};// 利用虛函式進行動態型別識別的方法可以滿足工程的需要
// 但是維護性會隨著派生類的增多而成指數級增加。
void test_polymorphism(parent* p)
else
}// way 2 dynamic_cast,dynamic_cast實現父類指標向派生類的安全轉換
class parentdynamic
};class childdynamic :public parentdynamic
};void test_dynamic(parentdynamic* pd)
else }
// way 3 typeid typeid返回型別資訊
class newchilddynamic :public parentdynamic
;void test_typeid(parentdynamic* p)
else if (typeid(*p) == typeid(newchilddynamic))
else }
int main()
RTTI機制詳解
引子 以前我們 過,rtti的訪問和虛表相關,並且rtti基本上是為了dynamic cast 和typeid以及異常而實現的。今天我們詳細 下異常的實現機制。c abi中的rtti 通過c 程式語言的定義,我們知道型別資訊在用於以下三個目的時,可以在執行時獲得 a.為了支援typeid運算子 b....
虛函式與RTTI
以前一直對虛函式和rtti不是很了解,最近看了下書,對虛函式和rtti有了一些新的了解。在很多的地方我們都能找到虛函式是通過vftable 虛函式表 來實現的,下面我來說下我自己的理解。有虛函式的物件,在其資料區會有虛函式表指標,這個指標指向虛函式表。一,類會有幾個虛函式表和虛函式指標呢?乙個類只有...
異常處理與RTTI
大家都知道好的異常處理是很難的。原因很多,在每個 生命週期 的異常層中 很難編寫異常安全的 可能會從意想不到的地方丟擲乙個異常 雙關語!理解糟糕的異常層次結構可能會很複雜,很慢,因為大量的巫術發生在引擎蓋下,這是很危險的,因為不恰當地丟擲乙個異常可能會呼叫不可原諒的std terminate。儘管任...