• <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>

            統計

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

            留言簿(6)

            隨筆分類

            文章分類

            Link

            搜索

            •  

            積分與排名

            • 積分 - 165512
            • 排名 - 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 閱讀(4227) 評論(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

            不錯,剛看到:)
              回復  更多評論    
            久久综合视频网| 久久99亚洲综合精品首页| 婷婷久久综合| 久久精品国产亚洲αv忘忧草| 国产成人精品综合久久久久| 色综合久久久久久久久五月| 久久天堂电影网| 亚洲乱码日产精品a级毛片久久| 久久精品国产男包| 狠狠综合久久综合中文88| 国产69精品久久久久观看软件| 成人久久久观看免费毛片| 久久久久一本毛久久久| 久久精品成人免费网站| 人人妻久久人人澡人人爽人人精品| 色狠狠久久AV五月综合| 无码任你躁久久久久久久| 99久久中文字幕| 漂亮人妻被黑人久久精品| 国产精品内射久久久久欢欢| 久久久久人妻精品一区| 久久久精品人妻一区二区三区蜜桃| 中文字幕一区二区三区久久网站| 久久亚洲精品人成综合网| 久久亚洲sm情趣捆绑调教| 久久午夜综合久久| 国产女人aaa级久久久级| 国产精品无码久久综合| 久久久精品国产sm调教网站| 国产美女亚洲精品久久久综合| 久久久久久国产精品美女| 久久99精品久久久久久野外| 国产精品女同一区二区久久| 狠狠久久综合伊人不卡| 国产一区二区精品久久岳| 国内精品伊人久久久久网站| 欧美久久精品一级c片片| 国产午夜精品理论片久久| 精品久久综合1区2区3区激情| 国产精品狼人久久久久影院| 91性高湖久久久久|