如何在執行時確定物件型別(RTTI)

2021-04-16 00:34:02 字數 1471 閱讀 1023

如何在執行時確定物件型別(rtti)

rtti 是「runtime type information」的縮寫,意思是:執行時型別資訊。它提供了執行時確定物件型別的方法。本文將簡略介紹 rtti 的一些背景知識、描述 rtti 的概念,並通過具體例子和**介紹什麼時候使用以及如何使用 rtti;本文還將詳細描述兩個重要的 rtti 運算子的使用方法,它們是 typeid 和 dynamic_cast。

其實,rtti 在c++中並不是什麼新的東西,它早在十多年以前就已經出現了。但是大多數開發人員,包括許多高層次的c++程式設計師對它並不怎麼熟悉,更不用說使用 rtti 來設計和編寫應用程式了。

一些物件導向專家在傳播自己的設計理念時,大多都主張在設計和開發中明智地使用虛擬成員函式,而不用 rtti 機制。但是,在很多情況下,虛函式無法克服本身的侷限。每每涉及到處理異類容器和根基類層次(如 mfc)時,不可避免要對物件型別進行動態判斷,也就是動態型別的偵測。如何確定物件的動態型別呢?答案是使用內建的 rtti 中的運算子:typeid 和 dynamic_cast。

首先讓我們來設計乙個類層次,假設我們建立了某個處理檔案的抽象基類。它宣告下列純虛函式:open()、close()、read()和 write():

class file

;現在從 file 類派生的類要實現基類的純虛函式,同時還要提供一些其他的操作。假設派生類為 diskfile,除了實現基類的純虛函式外,還要實現自己的flush()和defragment()操作: class diskfile: public file

}    

唉,這種做法真是顯得太業餘了,以後每次新增新的類,毫無疑問都必須打類似的補丁。顯然,這不是乙個理想的解決方案。這個時候我們就要用到 dynamic_cast,這個運算子用於多型程式設計中保證在執行時發生正確的轉換(即編譯器無法驗證是否發生正確的轉換)。用它來確定某個物件是 mediafile 物件還是它的派生類物件。dynamic_cast 常用於從多型程式設計基類指標向派生類指標的向下型別轉換。它有兩個引數:乙個是型別名;另乙個是多型物件的指標或引用。其功能是在執行時將物件強制轉換為目標型別並返回布林型結果。也就是說,如果該函式成功地並且是動態的將 *pfile 強制轉換為 mediafile,那麼 pfile的動態型別是 mediafile 或者是它的派生類。否則,pfile 則為其它的型別:void menu::build(const file * pfile)

else if (dynamic_cast (pfile))

}   

細細想一下,雖然使用 dynamic_cast 確實很好地解決了我們的問題,但也需要我們付出代價,那就是與 typeid 相比,dynamic_cast 不是乙個常量時間的操作。為了確定是否能完成強制型別轉換,dynamic_cast`必須在執行時進行一些轉換細節操作。因此在使用 dynamic_cast 操作時,應該權衡對效能的影響。 

如何在執行時確定物件型別(RTTI)

如何在執行時確定物件型別 rtti rtti 是 runtime type information 的縮寫,意思是 執行時型別資訊。它提供了執行時確定物件型別的方法。本文將簡略介紹 rtti 的一些背景知識 描述 rtti 的概念,並通過具體例子和 介紹什麼時候使用以及如何使用 rtti 本文還將詳...

如何在執行時確定物件型別(RTTI)

rtti 是 runtime type information 的縮寫,意思是 執行時型別資訊。它提供了執行時確定物件型別的方法。本文將簡略介紹 rtti 的一些背景知識 描述 rtti 的概念,並通過具體例子和 介紹什麼時候使用以及如何使用 rtti 本文還將詳細描述兩個重要的 rtti 運算子的...

如何在執行時確定物件型別(RTTI)

rtti 是 runtime type information 的縮寫,意思是 執行時型別資訊。它提供了執行時確定物件型別的方法。本文將簡略介紹 rtti 的一些背景知識 描述 rtti 的概念,並通過具體例子和 介紹什麼時候使用以及如何使用 rtti 本文還將詳細描述兩個重要的 rtti 運算子的...