C 中的RTTI機制詳解

2021-10-19 05:31:51 字數 1710 閱讀 8003

前言

rtti是」runtime type information」的縮寫,意思是執行時型別資訊,它提供了執行時確定物件型別的方法。rtti並不是什麼新的東西,很早就有了這個技術,但是,在實際應用中使用的比較少而已。而我這裡就是對rtti進行總結,今天我沒有用到,並不代表這個東西沒用。學無止境,先從typeid函式開始講起。

typeid函式

typeid的主要作用就是讓使用者知道當前的變數是什麼型別的,比如以下**:

複製** **如下:

#include

#include

using namespace std;

int main()

;在type_info類中,複製建構函式和賦值運算子都是私有的,同時也沒有預設的建構函式;所以,我們沒有辦法建立type_info類的變數,例如type_info a;這樣是錯誤的。那麼typeid函式是如何返回乙個type_info類的物件的引用的呢?我在這裡不進行討論,思路就是類的友元函式。

typeid函式的使用

typeid使用起來是非常簡單的,常用的方式有以下兩種:

1.使用type_info類中的name()函式返回物件的型別名稱

就像上面的**中使用的那樣;但是,這裡有一點需要注意,比如有以下**:

複製** **如下:

#include

#include

using namespace std;

class a

delete pa;

}在上面**中,如果我們直接將pa賦值給pc,這樣編譯器就會提示錯誤,而當我們加上了dynamic_cast之後,一切就ok了。那麼dynamic_cast在後面幹了什麼呢?

dynamic_cast主要用於在多型的時候,它允許在執行時刻進行型別轉換,從而使程式能夠在乙個類層次結構中安全地轉換型別,把基類指標(引用)轉換為派生類指標(引用)。我在《com程式設計——介面的背後》這篇博文中總結的那樣,當類中存在虛函式時,編譯器就會在類的成員變數中新增乙個指向虛函式表的vptr指標,每乙個class所關聯的type_info object也經由virtual table被指出來,通常這個type_info object放在**的第乙個slot。當我們進行dynamic_cast時,編譯器會幫我們進行語法檢查。如果指標的靜態型別和目標型別相同,那麼就什麼事情都不做;否則,首先對指標進行調整,使得它指向vftable,並將其和調整之後的指標、調整的偏移量、靜態型別以及目標型別傳遞給內部函式。其中最後乙個引數指明轉換的是指標還是引用。兩者唯一的區別是,如果轉換失敗,前者返回null,後者丟擲bad_cast異常。對於在typeid函式的使用中所示例的程式,我使用dynamic_cast進行更改,**如下:

複製** **如下:

#include

#include

using namespace std;

class a

{public:

virtual void print() { cout<<「this is class a.」<(a))

{cout<<「i am a b truly.」<(a))

{cout<<「i am a c truly.」《這個是使用dynamic_cast進行改寫的版本。實際專案中,這種方法會使用的更多點。

總結

您可能感興趣的文章:

C 中的RTTI機制詳解

前言 rtti是 runtime type information 的縮寫,意思是執行時型別資訊,它提供了執行時確定物件型別的方法。rtti並不是什麼新的東西,很早就有了這個技術,但是,在實際應用中使用的比較少而已。而我這裡就是對rtti進行總結,今天我沒有用到,並不代表這個東西沒用。學無止境,先從...

RTTI機制詳解

引子 以前我們 過,rtti的訪問和虛表相關,並且rtti基本上是為了dynamic cast 和typeid以及異常而實現的。今天我們詳細 下異常的實現機制。c abi中的rtti 通過c 程式語言的定義,我們知道型別資訊在用於以下三個目的時,可以在執行時獲得 a.為了支援typeid運算子 b....

C 的 RTTI 可以刪掉了

一兩年沒碰程式設計了,最近開始寫乙個程式,寫的過程中想到了一些東西。看這段 這個乙個用模板實現的協議類,擁有乙個虛成員函式和乙個虛析構函式,其功能可以用以下 來測試 和協議類有點不同,這裡的模板協議類語義上並不是指標,是不是省心很多?有了新標準的move語意的話,效能上也不會有什麼問題。這只是個很簡...