運行期類型信息

在程式設計中,所謂的運行期類型信息(Runtime type information,RTTI)指的是在程式運行時保存其對象的類型信息的行為。某些語言實現僅保留有限的類型信息,例如繼承樹信息,而某些實現會保留較多信息,例如對象的屬性及方法信息。

運行期類型信息是一個電腦術語,用以標示一個電腦語言是否有能力在運行期保持或判別其對象或變數的類型信息。

基本介紹

  • 中文名:運行期類型信息
  • 外文名:Runtime type information
  • 縮寫:RTTI
  • 領域:計算機
C++,Visual C++,

C++

雖然運行期類型信息是一個通用的電腦術語,但是通常用來稱呼C++的特質。為了讓C++的指令達到動態指派(dynamic_cast)、類型識別碼(typeid)操作與異常處理的能力,運行期類型信息是必須的。
C++語言提供了dynamic_cast和typeid兩種運算符,typeid用於在運行時識別類型信息,dynamic_cast具有運行時類型識別和類型轉換匹配2個功能。實現方法為每個類型對應一個const type_info類型對象,存儲了這個確切類型信息。在C++標準頭檔案<typeinfo>中,type_info類重載了operator=()、operator!=()、name()等成員函式。
dynamic_cast的語法形如:
dynamic_cast<dest>(src);
dest和src都必須為指針或者引用。如果運行時src和dest所引用的對象,是相同類型,或者存在is-a關係(public繼承),則轉換成功;否則轉換失敗。dynamic_cast只能用來轉換多態類型(即定義了虛函式)的對象的指針或引用。如果運算元是指針,成功則返回目標類型的指針,失敗返回NULL。如果運算元是引用,成功則返回目標類型的引用,失敗拋出std::bad_cast異常。
dynamic_cast的“運行時類型的轉換匹配”,是通過維護一棵由type_info類型對象作為節點的類型繼承關係的樹,遍歷這棵繼承樹來確定一個待轉換的對象的類型和目標類型之間是否存在is-a關係。
下列是一C++的運行期類型信息套用示例:
class base {  virtual ~base(){}};class derived : public base {  public:    virtual ~derived(){}    int compare (derived &ref);};int my_comparison_method_for_generic_sort (base &ref1, base &ref2){  derived & d = dynamic_cast<derived &>(ref1); // rtti used here  // rtti enables the process to throw a bad_cast exception  // if the cast is not successful  return d.compare (dynamic_cast<derived &>(ref2));}

Visual C++

在類的虛表的前面存放RTTI數據塊的指針。因此,類必須有虛函式,才會有RTTI。 數據結構如下:
struct TypeDescriptor{    DWORD ptrToVTable;    DWORD spare;    char name[8];};struct PMD{    int mdisp;  //member displacement    int pdisp;  //vbtable displacement    int vdisp;  //displacement inside vbtable};struct RTTIBaseClassDescriptor{    struct TypeDescriptor* pTypeDescriptor; //type descriptor of the class    DWORD numContainedBases; //number of nested classes following in the Base Class Array    struct PMD where;        //pointer-to-member displacement info    DWORD attributes;        //flags, usually 0};struct RTTIClassHierarchyDescriptor{    DWORD signature;      //always zero?    DWORD attributes;     //bit 0 set = multiple inheritance, bit 1 set = virtual inheritance    DWORD numBaseClasses; //number of classes in pBaseClassArray    struct RTTIBaseClassArray* pBaseClassArray;};struct RTTICompleteObjectLocator{    DWORD signature; //always zero ?    DWORD offset;    //offset of this vtable in the complete class    DWORD cdOffset;  //constructor displacement offset    struct TypeDescriptor* pTypeDescriptor; //TypeDescriptor of the complete class    struct RTTIClassHierarchyDescriptor* pClassDescriptor; //describes inheritance hierarchy};

相關詞條

熱門詞條

聯絡我們