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

統計

  • 隨筆 - 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>
            好看的日韩视频| aa成人免费视频| 亚洲午夜视频在线观看| 农村妇女精品| 亚洲高清不卡av| 亚洲日本aⅴ片在线观看香蕉| 老司机一区二区| 欧美国产视频在线观看| 亚洲国产美女| 亚洲综合视频网| 久久久久综合网| 欧美久久久久免费| 国产精品视频免费在线观看| 韩日午夜在线资源一区二区| 亚洲激情黄色| 久久国产精品一区二区| 亚洲国产成人午夜在线一区| 一本色道久久综合精品竹菊| 久久精品一区四区| 国产精品久线观看视频| 亚洲日本理论电影| 蜜桃精品一区二区三区| 先锋影院在线亚洲| 国产精品国产三级欧美二区| 亚洲三级网站| 欧美成人精品激情在线观看| 亚洲欧美日韩成人高清在线一区| 欧美精品亚洲二区| 亚洲人成绝费网站色www| 欧美影院一区| 一区二区三区在线观看国产| 久久精品视频免费观看| 小嫩嫩精品导航| 国产亚洲精品bt天堂精选| 欧美一级理论片| 欧美亚洲视频一区二区| 中日韩高清电影网| 欧美激情四色 | 国产女优一区| 性做久久久久久久免费看| 一区二区三区欧美视频| 欧美日韩在线电影| 久久精品人人爽| 欧美国产精品日韩| 一级日韩一区在线观看| 亚洲欧美日韩综合aⅴ视频| 国产亚洲欧美一级| 亚洲国产综合91精品麻豆| 欧美视频一区二区三区四区| 久久裸体艺术| 欧美日韩精品系列| 久久综合影音| 欧美三级第一页| 欧美黑人多人双交| 国产欧美在线| 一本久久综合亚洲鲁鲁五月天 | 久久精品夜色噜噜亚洲a∨| 99pao成人国产永久免费视频| 亚洲午夜精品国产| 亚洲看片免费| 鲁大师影院一区二区三区| 先锋资源久久| 欧美三级日韩三级国产三级| 久久亚洲精品伦理| 国产午夜精品理论片a级探花| 亚洲精品韩国| 亚洲欧洲在线一区| 日韩视频在线一区二区| 久久久99精品免费观看不卡| 欧美日韩亚洲一区二区三区在线 | 一区二区成人精品| 一本一本久久| 欧美日韩亚洲在线| 亚洲午夜激情网站| 亚洲女性裸体视频| 国产精品免费网站在线观看| 正在播放欧美视频| 久久国产精品久久w女人spa| 国产欧美日韩亚州综合| 久久精品国产综合| 玖玖综合伊人| 999在线观看精品免费不卡网站| 欧美日韩国产综合久久| 新狼窝色av性久久久久久| 蜜桃久久精品一区二区| 亚洲精品视频免费观看| 国产伦精品一区二区三区免费迷| 亚洲欧美日韩视频二区| 亚洲第一久久影院| 香蕉乱码成人久久天堂爱免费 | 国产日韩1区| 欧美激情一区二区三区四区| 亚洲一区二区高清视频| 亚洲第一中文字幕| 久久福利资源站| 亚洲一二区在线| 亚洲精品中文字幕在线| 国产在线精品一区二区中文| 欧美少妇一区| 欧美国内亚洲| 欧美国产一区二区| 久久国产综合精品| 欧美自拍偷拍午夜视频| 亚洲一区二区三区四区在线观看 | 亚洲午夜女主播在线直播| 久久久久久综合网天天| 欧美在线视频在线播放完整版免费观看| 黄色亚洲精品| 在线成人av网站| 国产一区二区三区在线观看视频| 国产精品久久久久久久久久尿 | 亚洲午夜黄色| 一区二区三区导航| 在线一区日本视频| 亚洲在线成人| 久久成人国产| 免费欧美高清视频| 欧美日韩123| 国产精品一区二区三区四区 | 香蕉免费一区二区三区在线观看| 一本色道久久加勒比88综合| 亚洲最新合集| 欧美一区二区三区日韩| 久久综合五月天婷婷伊人| 欧美大片免费观看| 国产日韩精品一区二区三区在线| 国产一区二区三区四区| 亚洲精品乱码久久久久久日本蜜臀| 亚洲欧洲一区二区三区| 在线亚洲一区| 欧美激情一区二区三区成人| 亚洲日韩欧美一区二区在线| 亚洲一区二区三区中文字幕| 午夜天堂精品久久久久| 久久综合激情| 国产精品色婷婷久久58| 亚洲精品视频一区二区三区| 亚洲欧美一区二区三区久久 | 欧美精品91| 韩日欧美一区| 一区二区三区四区国产精品| 亚洲国产毛片完整版 | 欧美精品七区| 这里只有精品在线播放| 亚洲美女毛片| 欧美激情精品久久久久久黑人 | 久久综合色一综合色88| 99re热精品| 欧美日韩亚洲综合一区| 亚洲三级视频| 亚洲精品一区二区三区樱花| 欧美激情免费观看| 亚洲第一久久影院| 最新国产拍偷乱拍精品| 欧美调教vk| 久久伊人精品天天| 欧美日本国产一区| 狼人天天伊人久久| 国产精品久久久久久五月尺| 久久先锋资源| 欧美亚州韩日在线看免费版国语版| 先锋影音一区二区三区| 久久综合国产精品台湾中文娱乐网| 91久久综合亚洲鲁鲁五月天| 一本色道久久加勒比88综合| 伊大人香蕉综合8在线视| 一本一本久久| 亚洲欧美偷拍卡通变态| 午夜国产精品视频| 亚洲激情第一页| 亚洲国产专区校园欧美| 欧美成人69| 亚洲香蕉成视频在线观看| av成人免费| 欧美日韩在线观看一区二区三区 | 国产精品久久久久天堂| 欧美韩日一区二区三区| 国产亚洲欧美一区| 午夜视黄欧洲亚洲| 欧美自拍偷拍午夜视频| 国产日韩欧美日韩大片| 久久躁日日躁aaaaxxxx| 亚洲人成人一区二区在线观看| 欧美性色aⅴ视频一区日韩精品| 亚洲精选大片| 久久精品亚洲热| 亚洲国产成人av在线| 免费成人黄色| 亚洲网站在线| 午夜在线视频观看日韩17c| 国产欧美一区二区三区沐欲| 羞羞色国产精品| 久久免费精品视频| 亚洲国产精品女人久久久| 欧美精品免费看| 午夜一区二区三视频在线观看 | 久久夜色精品一区| 一区二区三区精品国产| 欧美激情小视频| 久久一区国产|