fbpx
维基百科

執行期型態訊息

在程式設計中,所謂的執行期型態訊息(Runtime type information,RTTI)指的是在程式執行時保存其物件型態訊息的行為。某些語言實作僅保留有限的型態訊息,例如繼承樹資訊,而某些實作會保留較多資訊,例如物件的屬性及方法訊息。

執行期型態訊息是一個電腦術語,用以標示一個電腦語言是否有能力在執行期保持或判別其物件或變數的型態訊息。

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 }; 

參閱 编辑

執行期型態訊息, 在程式設計中, 所謂的, runtime, type, information, rtti, 指的是在程式執行時保存其物件的型態訊息的行為, 某些語言實作僅保留有限的型態訊息, 例如繼承樹資訊, 而某些實作會保留較多資訊, 例如物件的屬性及方法訊息, 是一個電腦術語, 用以標示一個電腦語言是否有能力在執行期保持或判別其物件或變數的型態訊息, 编辑雖然是一個通用的電腦術語, 但是通常用來稱呼c, 的特質, 為了讓c, 的指令達到動態指派, dynamic, cast, 型態識別碼, typeid, . 在程式設計中 所謂的執行期型態訊息 Runtime type information RTTI 指的是在程式執行時保存其物件的型態訊息的行為 某些語言實作僅保留有限的型態訊息 例如繼承樹資訊 而某些實作會保留較多資訊 例如物件的屬性及方法訊息 執行期型態訊息是一個電腦術語 用以標示一個電腦語言是否有能力在執行期保持或判別其物件或變數的型態訊息 C 编辑雖然執行期型態訊息是一個通用的電腦術語 但是通常用來稱呼C 的特質 為了讓C 的指令達到動態指派 dynamic cast 型態識別碼 typeid 操作與例外處理的能力 執行期型態訊息是必須的 C 语言提供了dynamic cast和typeid两种运算符 typeid用于在运行时识别类型信息 dynamic cast具有运行时类型识别和类型转换匹配2个功能 实现方法为每个类型对应一个const type info类型对象 存储了这个确切类型信息 在C 标准头文件 lt typeinfo gt 中 type info类重载了operator operator name 等成员函数 dynamic cast的语法形如 dynamic cast lt dest gt 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 amp ref int my comparison method for generic sort base amp ref1 base amp ref2 derived amp d dynamic cast lt derived amp gt 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 lt derived amp gt 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 參閱 编辑物件導向程序設計 C 取自 https zh wikipedia org w index php title 執行期型態訊息 amp oldid 67577787, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。