青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

統計

  • 隨筆 - 50
  • 文章 - 42
  • 評論 - 147
  • 引用 - 0

留言簿(6)

隨筆分類

文章分類

Link

搜索

  •  

積分與排名

  • 積分 - 166565
  • 排名 - 159

最新評論

閱讀排行榜

評論排行榜

對象與對象的類型信息----獲取對象的RTTI信息

夢在天涯 在上篇文章里問可不可以研究下對象與對象的類型信息怎么聯系起來的,就是當調用dynamic_cast的時候為什么能夠正確的識別對象的類型

RTTI(Run Time Type Identification)運行時類型識別是有編譯器在編譯器生成的特殊類型信息,包括對象繼承關系,對象本身的描述,RTTI是為多態而生成的信息,所以只有具有虛函數的對象在會生成

那RTTI在哪里呢?
MSVC編譯器在vftable前設置了一個指針,指向叫做“Complete Object Locator”(完整對象定位器)的結構。這樣稱呼是因為它允許編譯器從特定的vftable指針(因為一個類可能有若干vftable)找到完整對象的位置。COL就像如下定義:

請看如下代碼:

  1#include "iostream"
  2#include "string"
  3
  4
  5using namespace std;
  6class Aclass
  7{
  8public:
  9     int a;
 10    virtual void setA(int tmp)
 11    {
 12        a=tmp;
 13        cout<<a<<endl;
 14    }

 15}
;
 16class Bclass:public Aclass
 17{
 18public:
 19    virtual void setA(int tmp)
 20    {
 21        a=tmp+10;
 22        cout<<a<<endl;
 23    }

 24public:
 25    void print()
 26    {
 27        cout<<a<<endl;
 28    }

 29}
;
 30class Cclass:public Bclass
 31{
 32}
;
 33typedef unsigned long DWORD;
 34struct TypeDescriptor
 35{
 36    DWORD ptrToVTable;
 37    DWORD spare;
 38    char name[8];
 39}
;
 40struct PMD
 41{
 42
 43    int mdisp;  //member displacement
 44
 45    int pdisp;  //vbtable displacement
 46
 47    int vdisp;  //displacement inside vbtable
 48
 49}
;
 50struct RTTIBaseClassDescriptor
 51
 52{
 53
 54    struct TypeDescriptor* pTypeDescriptor; //type descriptor of the class
 55
 56    DWORD numContainedBases; //number of nested classes following in the Base Class Array
 57
 58    struct PMD where;        //pointer-to-member displacement info
 59
 60    DWORD attributes;        //flags, usually 0
 61
 62}
;
 63
 64struct RTTIClassHierarchyDescriptor
 65{
 66
 67    DWORD signature;      //always zero?
 68
 69    DWORD attributes;     //bit 0 set = multiple inheritance, bit 1 set = virtual inheritance
 70
 71    DWORD numBaseClasses; //number of classes in pBaseClassArray
 72
 73    struct RTTIBaseClassArray* pBaseClassArray;
 74
 75}
;
 76
 77struct RTTICompleteObjectLocator
 78
 79{
 80
 81    DWORD signature; //always zero ?
 82
 83    DWORD offset;    //offset of this vtable in the complete class
 84
 85    DWORD cdOffset;  //constructor displacement offset
 86
 87    struct TypeDescriptor* pTypeDescriptor; //TypeDescriptor of the complete class
 88
 89    struct RTTIClassHierarchyDescriptor* pClassDescriptor; //describes inheritance hierarchy
 90
 91
 92}
;
 93
 94
 95int _tmain(int argc, _TCHAR* argv[])
 96{
 97    Aclass* ptra=new Bclass;
 98    int ** ptrvf=(int**)(ptra);
 99    RTTICompleteObjectLocator str=
100        *((RTTICompleteObjectLocator*)(*((int*)ptrvf[0]-1)));
101    //abstract class name from RTTI
102    string classname(str.pTypeDescriptor->name);
103    classname=classname.substr(4,classname.find("@@")-4);
104    cout<<classname<<endl;
105    system("pause");
106    return 0;
107}

108

輸出結果:


在RTTI運行時結構體中包含許多豐富的信息,甚至我們可以利用一個實例的RTTI信息去復原整個類繼承圖譜

而對于dynamic_cast也是利用這個信息來準確的識別實例所對應的類型,不過如果對于沒有多態的實例,dynamic_cast所做的也只是和編譯器類型轉換一樣的事情,僅僅是通過類型和繼承關系進行轉換,還是看例子吧:

 1class mother
 2{
 3    int a;
 4    int b;
 5}
;
 6class father
 7{
 8    double c;
 9}
;
10class son:public mother,public father
11{
12    char a;
13    short c;
14}
;
15
16int _tmain(int argc, _TCHAR* argv[])
17{
18    mother* m=new son();
19    father* f=dynamic_cast<father*>(m);
20    system("pause");
21    return 0;
22}
運行會得到以下錯誤:
error C2683: “dynamic_cast”:“mother”不是多態類型
修改如下
class mother
{
 int a;
 int b;
 virtual void fun()
 {
 }
};
一切正常

就說這么多吧,歡迎多交流

posted on 2009-03-12 17:55 pear_li 閱讀(4247) 評論(3)  編輯 收藏 引用 所屬分類: C++

評論

# re: 對象與對象的類型信息----獲取對象的RTTI信息 2009-03-12 21:32 夢在天涯

超好啊,原來真的在前面啊,看到C++對象模型說的,但是我確實是沒有想到原來是在VTable - 1啊!
  回復  更多評論    

# re: 對象與對象的類型信息----獲取對象的RTTI信息 2009-03-13 00:19 pear_li

@夢在天涯
呵呵,是啊,夢在天涯的確是看了好多書啊
  回復  更多評論    

# re: 對象與對象的類型信息----獲取對象的RTTI信息 2010-08-22 00:19 tomren

不錯,剛看到:)
  回復  更多評論    
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美精品色综合| 久久一区二区视频| 欧美性大战久久久久久久| av成人天堂| 一区二区久久久久久| 国产精品ⅴa在线观看h| 欧美在线首页| 快射av在线播放一区| 9i看片成人免费高清| 亚洲午夜女主播在线直播| 国产亚洲欧美另类一区二区三区| 久久女同互慰一区二区三区| 欧美**人妖| 亚洲欧洲av一区二区| 久久国产精品第一页 | 亚洲天堂偷拍| 狠狠色狠狠色综合日日91app| 模特精品裸拍一区| 欧美日韩网址| 久久男人资源视频| 欧美日韩精品二区第二页| 久久国产免费| 欧美精品一区二区三区在线播放| 香蕉久久夜色精品国产使用方法| 久久久精品一区| 亚洲一区二区三区涩| 久久久综合网| 欧美在线黄色| 欧美精品一区二区三区一线天视频 | 国产色婷婷国产综合在线理论片a| 欧美成人免费大片| 国产精品成人一区二区三区吃奶| 裸体素人女欧美日韩| 国产精品国产成人国产三级| 欧美岛国激情| 国产日韩欧美视频| 日韩视频二区| 亚洲国产欧美日韩另类综合| 亚洲免费在线观看| 一区二区精品国产| 蜜臀av在线播放一区二区三区| 香蕉国产精品偷在线观看不卡| 欧美福利一区| 欧美电影免费观看| 国语自产精品视频在线看一大j8| 夜夜狂射影院欧美极品| 日韩亚洲精品视频| 六月婷婷久久| 欧美顶级艳妇交换群宴| 黄色精品免费| 久久爱另类一区二区小说| 欧美性猛交xxxx乱大交退制版| 亚洲二区在线观看| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲免费在线看| 欧美一区二区日韩一区二区| 欧美日韩在线视频一区二区| 亚洲精品午夜精品| 一本色道久久| 欧美日韩精品免费观看| 亚洲精品中文字幕在线| 亚洲精品视频在线观看免费| 可以看av的网站久久看| 欧美激情第9页| 91久久精品国产91久久| 欧美高清在线播放| 亚洲国产视频a| 一区二区三区国产在线| 欧美日韩一区二| 亚洲专区一二三| 欧美制服第一页| 国产一区二区三区奇米久涩| 久久狠狠一本精品综合网| 麻豆成人精品| 亚洲毛片一区| 欧美日韩在线播放三区四区| 亚洲小视频在线观看| 欧美在线免费观看| 国内视频一区| 欧美成人精品一区二区| 亚洲激情女人| 亚洲欧美综合国产精品一区| 国内精品久久久久久久97牛牛| 久久婷婷亚洲| 亚洲久久一区| 久久九九精品99国产精品| 狠狠色综合网| 欧美日韩第一页| 午夜天堂精品久久久久 | 欧美专区日韩视频| 精品成人一区二区三区四区| 欧美aa在线视频| 亚洲一区二区黄| 六月天综合网| 亚洲一区视频在线观看视频| 国产一区二区中文| 欧美精品偷拍| 欧美一区二区三区日韩| 亚洲人成网站精品片在线观看| 亚洲欧美成人一区二区三区| 在线精品视频免费观看| 欧美日韩中文| 老司机午夜精品视频在线观看| 日韩视频在线观看免费| 久久字幕精品一区| 亚洲欧美不卡| 亚洲人成小说网站色在线| 国产精品亚洲综合色区韩国| 欧美成人一区二免费视频软件| 亚洲一区二区动漫| 亚洲精华国产欧美| 久久一区中文字幕| 亚洲欧美一区在线| 99精品国产在热久久下载| 在线观看精品| 国产精品自在在线| 欧美日韩影院| 欧美国产国产综合| 久久久久久国产精品一区| 亚洲伊人伊色伊影伊综合网| 亚洲激情综合| 日韩系列欧美系列| 在线精品福利| 国产亚洲一区二区三区在线观看 | 韩国免费一区| 国产精品无人区| 欧美日韩精品一区| 欧美精品电影在线| 欧美不卡激情三级在线观看| 久久精品av麻豆的观看方式| 欧美亚洲视频| 午夜久久黄色| 午夜精品久久久久久久久久久久 | 久久亚洲色图| 久久免费视频网| 久久久99精品免费观看不卡| 午夜在线观看欧美| 欧美一区二区三区日韩视频| 亚洲欧美日韩国产一区二区三区| 一区二区三区四区国产| 99在线精品视频在线观看| 亚洲精品一区二区三区四区高清| 亚洲电影免费观看高清完整版在线观看 | 日韩视频欧美视频| 亚洲美女精品成人在线视频| 亚洲高清网站| 亚洲精品免费在线观看| 夜夜精品视频| 亚洲一区二区三区国产| 99视频热这里只有精品免费| 艳女tv在线观看国产一区| 一区二区欧美国产| 亚洲综合色丁香婷婷六月图片| 午夜精品一区二区三区在线播放 | 99这里只有精品| 亚洲一区免费看| 久久精品免费播放| 美女视频黄 久久| 亚洲国产aⅴ天堂久久| 亚洲精品视频在线观看网站| 亚洲一区二区三区中文字幕在线| 亚洲永久免费av| 久久久久国产成人精品亚洲午夜| 美国十次成人| 国产精品高潮呻吟久久av无限 | 国产精品美女久久久久久久| 国产一区二区三区四区五区美女| 在线观看福利一区| 亚洲天堂免费在线观看视频| 久久成人一区| 亚洲国产成人精品久久久国产成人一区 | 亚洲国产日韩欧美| 亚洲欧美福利一区二区| 久久一区二区三区四区五区| 欧美日韩一区自拍| 好吊色欧美一区二区三区视频| 亚洲人成在线影院| 亚洲欧美视频在线观看视频| 老司机67194精品线观看| 日韩亚洲欧美中文三级| 欧美在线观看一二区| 欧美精品尤物在线| 国产一区观看| 亚洲一区二区在线视频| 亚洲小视频在线观看| 国产精品一区二区久激情瑜伽| 国产视频精品va久久久久久| 亚洲伦理精品| 久久网站免费| 亚洲影音先锋| 欧美日韩国产91| 亚洲国产高清在线| 久久久久久久成人| 亚洲婷婷在线| 欧美日韩你懂的| 亚洲区一区二区三区| 久久婷婷激情| 欧美一级免费视频| 国产精品青草久久久久福利99| 日韩午夜黄色|