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

統(tǒng)計

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

留言簿(6)

隨筆分類

文章分類

Link

搜索

  •  

積分與排名

  • 積分 - 166566
  • 排名 - 159

最新評論

閱讀排行榜

評論排行榜

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

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

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

那RTTI在哪里呢?
MSVC編譯器在vftable前設(shè)置了一個指針,指向叫做“Complete Object Locator”(完整對象定位器)的結(jié)構(gòu)。這樣稱呼是因為它允許編譯器從特定的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

輸出結(jié)果:


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

而對于dynamic_cast也是利用這個信息來準(zhǔn)確的識別實例所對應(yīng)的類型,不過如果對于沒有多態(tài)的實例,dynamic_cast所做的也只是和編譯器類型轉(zhuǎn)換一樣的事情,僅僅是通過類型和繼承關(guān)系進行轉(zhuǎn)換,還是看例子吧:

 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”不是多態(tài)類型
修改如下
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啊!
  回復(fù)  更多評論    

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

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

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

不錯,剛看到:)
  回復(fù)  更多評論    
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久精品动漫| 国产日韩欧美综合| 女生裸体视频一区二区三区| 欧美在线视频不卡| 久久久久欧美| 亚洲福利电影| 亚洲精品无人区| 亚洲视频一起| 欧美一区二区日韩一区二区| 午夜伦理片一区| 久久深夜福利| 欧美午夜精品伦理| 国语自产精品视频在线看抢先版结局 | 国产精品色网| 黄色精品一区| 日韩视频一区二区在线观看| 亚洲欧美国产另类| 美女视频黄 久久| 99国产精品| 欧美专区日韩视频| 欧美日本在线视频| 国产在线国偷精品产拍免费yy| 亚洲国产天堂久久国产91| 亚洲淫片在线视频| 欧美波霸影院| 午夜激情综合网| 欧美理论视频| 在线观看av不卡| 午夜欧美视频| 亚洲日韩视频| 老司机亚洲精品| 国产视频亚洲精品| 亚洲夜晚福利在线观看| 欧美国产综合一区二区| 欧美一区二区精品在线| 欧美特黄一级| 亚洲日本欧美在线| 久久一区国产| 午夜一区二区三区不卡视频| 欧美日韩国产a| 亚洲国产毛片完整版| 久久精品一区二区| 亚洲伊人色欲综合网| 欧美三级在线视频| 在线视频精品一区| 亚洲日韩成人| 欧美久久久久久久久| 一区二区在线看| 欧美一级久久久久久久大片| 一二三四社区欧美黄| 欧美精品一区二区三区视频| 91久久精品国产91久久性色| 久久久久99精品国产片| 亚洲制服丝袜在线| 国产精品区二区三区日本| 国产精品羞羞答答xxdd| 午夜日韩在线| 亚洲国产精品激情在线观看| 久久综合色天天久久综合图片| 国产日韩欧美中文在线播放| 午夜精品一区二区三区四区| 中文国产成人精品| 国产精品久久久久一区| 性欧美18~19sex高清播放| 亚洲视频一区在线观看| 国产麻豆日韩欧美久久| 久久久国产午夜精品| 久久精品成人一区二区三区蜜臀 | 国外精品视频| 久久一区亚洲| 美女视频黄 久久| 亚洲国产欧美一区二区三区久久| 欧美福利在线观看| 欧美精品一区二区蜜臀亚洲 | 日韩一级大片| 亚洲毛片在线观看| 国产精品久久久久久户外露出| 香蕉国产精品偷在线观看不卡| 亚洲一区二区三区中文字幕在线 | 欧美a级一区二区| 欧美a级一区二区| 一区二区三区国产盗摄| 亚洲网站在线观看| 国产在线观看精品一区二区三区| 欧美成年人视频网站| 欧美啪啪一区| 久久久精品一区二区三区| 欧美成人国产| 午夜一区不卡| 蜜臀久久久99精品久久久久久| 艳女tv在线观看国产一区| 亚洲一区二区三区四区五区黄| 在线成人av.com| 一区二区三区国产盗摄| 樱花yy私人影院亚洲| 亚洲免费av观看| 国产一二三精品| 亚洲激情在线观看| 国产午夜精品久久久久久久| 亚洲第一区在线| 国产拍揄自揄精品视频麻豆| 亚洲高清不卡一区| 国产一区激情| 一区二区福利| 亚洲日本一区二区| 新片速递亚洲合集欧美合集| 亚洲免费观看高清完整版在线观看熊 | aa亚洲婷婷| 午夜伦欧美伦电影理论片| 亚洲伦理在线| 欧美影院视频| 亚洲欧美日本国产专区一区| 免费在线播放第一区高清av| 久久爱www.| 国产精品白丝黑袜喷水久久久 | 中文欧美在线视频| 久热精品视频在线观看一区| 欧美在线视频免费观看| 欧美日韩一区二区三区四区五区| 久久久爽爽爽美女图片| 国产精品入口福利| 一区二区欧美日韩| 99视频精品免费观看| 美日韩精品免费观看视频| 久久精品日产第一区二区| 国产精品入口| 亚洲欧美日韩国产综合| 午夜精品久久久久久久白皮肤| 欧美日韩精品一区二区天天拍小说 | 久久久av网站| 国产欧美一区二区三区在线老狼 | 欧美在线视屏| 欧美专区日韩视频| 国产女同一区二区| 亚洲欧美精品中文字幕在线| 亚洲欧美日韩一区二区三区在线观看 | 亚洲国产精品成人一区二区| 亚洲大胆女人| 免费成人黄色片| 欧美国产综合| 亚洲欧洲在线一区| 欧美成人资源| 亚洲毛片在线| 午夜精品久久久久久久久| 国产精品午夜在线观看| 亚洲欧洲av一区二区三区久久| 久久爱另类一区二区小说| 国产伊人精品| 久久一二三四| 亚洲日韩欧美一区二区在线| 亚洲无亚洲人成网站77777| 国产精品成人免费| 欧美亚洲在线观看| 男人的天堂亚洲在线| 亚洲久久一区二区| 欧美成人首页| 久热成人在线视频| 亚洲国产精品va在线看黑人| 亚洲人成网站在线播| 欧美日本一区| 亚洲一区二区视频| 麻豆成人精品| 亚洲精品在线观看视频| 国产精品黄视频| 久久经典综合| 亚洲美女黄网| 久久久亚洲国产天美传媒修理工| 亚洲国产精品国自产拍av秋霞| 欧美国产专区| 午夜免费电影一区在线观看| 欧美福利电影网| 亚洲综合不卡| 亚洲国产精品欧美一二99| 欧美日韩亚洲视频一区| 久久精品道一区二区三区| 亚洲精品中文字| 久久久久看片| 亚洲一区二区三区四区中文 | 在线午夜精品| 麻豆精品在线播放| 亚洲一区二区在线看| 欲香欲色天天天综合和网| 欧美性猛交xxxx乱大交蜜桃| 久久久噜噜噜久久久| 国产精品99久久久久久久vr| 免费成人高清在线视频| 校园激情久久| 亚洲最黄网站| 亚洲高清视频一区| 国产网站欧美日韩免费精品在线观看| 欧美成人日本| 久久久欧美精品sm网站| 亚洲制服少妇| 一本色道久久| 亚洲国产裸拍裸体视频在线观看乱了中文| 欧美在线综合| 亚洲欧美日韩天堂一区二区| 一区二区三区www| 亚洲日韩视频| 在线观看成人av电影|