(Translated by https://www.hiragana.jp/)
執行期型態訊息 - 维基百科,自由的百科全书 とべ转到内容ないよう

執行しっこうがたたい訊息

本页使用了标题或全文手工转换
维基百科ひゃっか自由じゆうてき百科ひゃっかぜん

ざいほどしき設計せっけいちゅう所謂いわゆるてき執行しっこうがたたい訊息(Runtime type information,RTTI)ゆびてきざいほどしき執行しっこうどき保存ほぞん物件ぶっけんてきかたたい訊息てき行為こういぼう些語げんさく保留ほりゅう有限ゆうげんてきがたたい訊息,れい繼承けいしょうじゅ訊,而某些さくかい保留ほりゅう較多訊,れい物件ぶっけんてき屬性ぞくせい方法ほうほう訊息。

執行しっこうがたたい訊息いち電腦でんのう術語じゅつごよう標示ひょうじいち電腦でんのうげん有能ゆうのうりょくざい執行しっこう保持ほじある判別はんべつ其物けんある變數へんすうてきがたたい訊息。

C++

[编辑]

雖然執行しっこうがたたい訊息いち通用つうようてき電腦でんのう術語じゅつごただしどおり常用じょうようらい稱呼しょうこC++てき特質とくしつためりょうゆずるC++てき指令しれいたちいた動態どうたいゆびdynamic_cast)、かたたい識別しきべつ碼(typeid操作そうさあずか例外れいがい處理しょりてき能力のうりょく執行しっこうがたたい訊息必須ひっすてき

C++语言提供ていきょうりょうdynamic_casttypeid两种运算,typeidよう于在运行时识别类がたしんいき,dynamic_cast具有ぐゆう运行时类がた识别类型转换ひきはい2个功のう。实现方法ほうほう为每个类がた对应いち个const type_info类型对象,そん储了这个确切类型しんいきざいC++标准头文けん<typeinfo>なか,type_info类重载了operator=()、operator!=()、name()とうなり员函すう

dynamic_castてき语法がた如:

dynamic_cast<dest>(src);

destsrc必须为指针或しゃ引用いんよう。如果运行时srcdestしょ引用いんようてき对象,しょうどう类型,あるもの存在そんざい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
};

まいり

[编辑]