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

的筆記

隨時隨地編輯

Dynamic、Static、Reinterpret、Const Cast

一、向上類型轉換


情形一:
C++ code
class A
{
public:
 virtual void fun()
 {
  int a=0;
 }
};

class B :public A
 2{
 3public:
 4    void fun()
 5    {
 6        int b=0;
 7    }

 8}
;
 9
10int _tmain(int argc, _TCHAR* argv[])
11{
12
13    B obj;
14
15    {
16        A* p = (&obj);
17        p->fun();
18    }

19
20    {
21        A* p = static_cast< A* >(&obj);
22        p->fun();
23    }

24
25    {
26        A* p = dynamic_cast< A* >(&obj);
27        p->fun();
28    }

29
30    {
31        A* p = reinterpret_cast< A* >(&obj);
32        p->fun();
33    }

34
35    return 0;
36}

Disassembly
 1    B obj;
 2  lea         ecx,[obj] 
 3  call        B::B (11A1104h) 
 4
 5    {
 6        A* p = (&obj);
 7  lea         eax,[obj] 
 8  mov         dword ptr [p],eax 
 9        p->fun();
10  mov         eax,dword ptr [p] 
11  mov         edx,dword ptr [eax] 
12  mov         esi,esp 
13  mov         ecx,dword ptr [p] 
14  mov         eax,dword ptr [edx] 
15  call        eax  
16  cmp         esi,esp 
17  call        @ILT+365(__RTC_CheckEsp) (11A1172h) 
18    }

19
20    {
21        A* p = static_cast< A* >(&obj);
22  lea         eax,[obj] 
23  mov         dword ptr [p],eax 
24        p->fun();
25  mov         eax,dword ptr [p] 
26  mov         edx,dword ptr [eax] 
27  mov         esi,esp 
28  mov         ecx,dword ptr [p] 
29  mov         eax,dword ptr [edx] 
30  call        eax  
31  cmp         esi,esp 
32  call        @ILT+365(__RTC_CheckEsp) (11A1172h) 
33    }

34
35    {
36        A* p = dynamic_cast< A* >(&obj);
37  lea         eax,[obj] 
38  mov         dword ptr [p],eax 
39        p->fun();
40  mov         eax,dword ptr [p] 
41  mov         edx,dword ptr [eax] 
42  mov         esi,esp 
43  mov         ecx,dword ptr [p] 
44  mov         eax,dword ptr [edx] 
45  call        eax  
46  cmp         esi,esp 
47  call        @ILT+365(__RTC_CheckEsp) (11A1172h) 
48    }

49
50    {
51        A* p = reinterpret_cast< A* >(&obj);
52  lea         eax,[obj] 
53  mov         dword ptr [p],eax 
54        p->fun();
55  mov         eax,dword ptr [p] 
56  mov         edx,dword ptr [eax] 
57  mov         esi,esp 
58  mov         ecx,dword ptr [p] 
59  mov         eax,dword ptr [edx] 
60  call        eax  
61  cmp         esi,esp 
62  call        @ILT+365(__RTC_CheckEsp) (11A1172h) 
63    }

看看B:B()的代碼,這個編譯器自動幫我們加上去的代碼,如果沒有虛報是不會有的。
 1B::B:
 2  push        ebp  
 3  mov         ebp,esp 
 4  sub         esp,0CCh 
 5  push        ebx  
 6  push        esi  
 7  push        edi  
 8  push        ecx  
 9  lea         edi,[ebp-0CCh] 
10  mov         ecx,33h 
11  mov         eax,0CCCCCCCCh 
12  rep stos    dword ptr es:[edi] 
13  pop         ecx  
14  mov         dword ptr [ebp-8],ecx 
15  mov         ecx,dword ptr [this
16  call        A::A (1321109h) 
17  mov         eax,dword ptr [this
18  mov         dword ptr [eax],offset B::`vftable' (1325740h) 
19  mov         eax,dword ptr [this
20  pop         edi  
21  pop         esi  
22  pop         ebx  
23  add         esp,0CCh 
24  cmp         ebp,esp 
25  call        @ILT+365(__RTC_CheckEsp) (1321172h) 
26  mov         esp,ebp 
27  pop         ebp  
28  ret              


情形二:

C++ CODE
只是在上文改動一處:去掉A::fun()的聲明virtual。

Disassembly對比
                  左:無virtual聲明                                                           右:有virtual聲明

結論: 無論哪種cast,向上類型都一樣。函數調用只與虛表有關。向上類型轉換是最常見的一種轉換,常見的大部分代碼都是用"向上類型轉換+虛函數"這種黃金組合完成一些c++類庫,例如MFC,QT,OGRE.這種轉換很符合常規,基本不會出錯。

二、向下類型轉換

情形一:

C++ CODE

A和B的聲明同上,只是改變A::fun()是虛函數。
 1    A obj;
 2
 3    {
 4        //B* p = (&obj);
 5        //p->fun();
 6        //error C2440: 'initializing' : cannot convert from 'A *' to 'B *'
 7        //Cast from base to derived requires dynamic_cast or static_cast
 8    }

 9
10    {
11        B* p = static_cast< B* >(&obj);
12        p->fun();
13    }

14
15    {
16        B* p = dynamic_cast< B* >(&obj);
17        p->fun();
18    }

19
20    {
21        B* p = reinterpret_cast< B* >(&obj);
22        p->fun();
23    }

Disassembly
 1    A obj;
 2  lea         ecx,[obj] 
 3  call        A::A (9310FFh) 
 4
 5    {
 6        //B* p = (&obj);
 7        //p->fun();
 8        //error C2440: 'initializing' : cannot convert from 'A *' to 'B *'
 9        //Cast from base to derived requires dynamic_cast or static_cast
10    }

11
12    {
13        B* p = static_cast< B* >(&obj);
14  lea         eax,[obj] 
15  mov         dword ptr [p],eax 
16        p->fun();
17  mov         eax,dword ptr [p] 
18  mov         edx,dword ptr [eax] 
19  mov         esi,esp 
20  mov         ecx,dword ptr [p] 
21  mov         eax,dword ptr [edx] 
22  call        eax  
23  cmp         esi,esp 
24  call        @ILT+355(__RTC_CheckEsp) (931168h) 
25    }

26
27    {
28        B* p = dynamic_cast< B* >(&obj);
29  push        0    
30  push        offset B `RTTI Type Descriptor' (937014h) 
31  push        offset A `RTTI Type Descriptor' (937000h) 
32  push        0    
33  lea         eax,[obj] 
34  push        eax  
35  call        @ILT+450(___RTDynamicCast) (9311C7h) 
36  add         esp,14h 
37  mov         dword ptr [p],eax 
38        p->fun();
39  mov         eax,dword ptr [p] 
40  mov         edx,dword ptr [eax] 
41  mov         esi,esp 
42  mov         ecx,dword ptr [p] 
43  mov         eax,dword ptr [edx] 
44  call        eax  
45  cmp         esi,esp 
46  call        @ILT+355(__RTC_CheckEsp) (931168h) 
47    }

48
49    {
50        B* p = reinterpret_cast< B* >(&obj);
51  lea         eax,[obj] 
52  mov         dword ptr [p],eax 
53        p->fun();
54  mov         eax,dword ptr [p] 
55  mov         edx,dword ptr [eax] 
56  mov         esi,esp 
57  mov         ecx,dword ptr [p] 
58  mov         eax,dword ptr [edx] 
59  call        eax  
60  cmp         esi,esp 
61  call        @ILT+355(__RTC_CheckEsp) (931168h) 
62    }

情形二:
C++ CODE
A和B的聲明同上,只是改變A::fun()不是虛函數。
    A obj;

    
{
        
//B* p = (&obj);
        
//p->fun();
        
//error C2440: 'initializing' : cannot convert from 'A *' to 'B *'
        
//Cast from base to derived requires dynamic_cast or static_cast
    }


    
{
        B
* p = static_cast< B* >(&obj);
        p
->fun();
    }


    
{
        
//B* p = dynamic_cast< B* >(&obj);
        
//p->fun();
        
//error C2683: 'dynamic_cast' : 'A' is not a polymorphic type
        
//*    1>        */e:\develop\test\testr555\testr555.cpp(7) : see declaration of 'A'
    }


    
{
        B
* p = reinterpret_cast< B* >(&obj);
        p
->fun();
    }


Disassembly
    A obj;

    
{
        
//B* p = (&obj);
        
//p->fun();
        
//error C2440: 'initializing' : cannot convert from 'A *' to 'B *'
        
//Cast from base to derived requires dynamic_cast or static_cast
    }


    
{
        B
* p = static_cast< B* >(&obj);
  lea         eax,[obj] 
  mov         dword ptr [p],eax 
        p
->fun();
  mov         ecx,dword ptr [p] 
  call        B::fun (10C1028h) 
    }


    
{
        
//B* p = dynamic_cast< B* >(&obj);
        
//p->fun();
        
//error C2683: 'dynamic_cast' : 'A' is not a polymorphic type
        
//*    1>        */e:\develop\test\testr555\testr555.cpp(7) : see declaration of 'A'
    }


    
{
        B
* p = reinterpret_cast< B* >(&obj);
  lea         eax,[obj] 
  mov         dword ptr [p],eax 
        p
->fun();
  mov         ecx,dword ptr [p] 
  call    

總結:
向下類型轉換時,強制類型轉換都是不行的。你不能作為一個父親,卻想借著兒子的名號玩一把年輕,用兒子的名義的名號去招搖撞騙以為自己是官二代。不過如果你是兒子,你可以將你的名字換成父親的,去做在父親名字下可以做的事,例如表明自己是官二代撞死人撞不死人在倒回來繼續撞。

當類型沒有虛表的時候,你不能進行向下類型的dynamic_cast,這個時候編譯器會報錯:
//error C2683: 'dynamic_cast' : 'A' is not a polymorphic type.
不過奇怪的是向上類型轉換的時候卻沒這個錯。如果有虛表,還是可以轉換的。不過結果是0.也就是說在想下類型轉換的時候,'dynamic_cast' 是沒有意義的。

三、C++類繼承之間轉換總結

向上類型轉換的時候,你閉著眼睛都可以想出結果,各種轉換關鍵字的反匯編其實都是一樣的,都是一個直接賦值。寫代碼的時候寫不寫無所謂。
向下類型轉換的時候,你得注意了。為了效率,你就酌情選擇動態還是靜態轉換吧。一般情況靜態就可以了。
沒事不要瞎折騰啊,語言轉換不好文檔化時分析代碼邏輯,也容易出錯。

posted on 2011-06-23 11:49 的筆記 閱讀(473) 評論(0)  編輯 收藏 引用 所屬分類: C++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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| 久久久精品2019中文字幕神马| 亚洲一区二区三区高清不卡| 亚洲精品日韩欧美| 日韩视频久久| 亚洲天堂网在线观看| 亚洲午夜精品久久久久久浪潮| 在线中文字幕一区| 欧美一区二区三区视频免费播放| 久久成人18免费网站| 久久综合亚州| 亚洲精品综合在线| 亚洲在线观看免费| 久久午夜色播影院免费高清| 欧美高清视频在线观看| 国产精品成人一区二区艾草| 国内精品视频666| 99视频日韩| 久久久久国产一区二区三区四区 | 亚洲精品日韩精品| 亚洲欧美高清| 欧美福利电影网| 国产欧美日韩视频| 亚洲精品久久7777| 欧美专区在线| 亚洲国产精品黑人久久久| 一本久久a久久免费精品不卡 | 欧美久久一区| 国内精品伊人久久久久av一坑| 亚洲国产精品va在线看黑人 | 欧美一区二区三区男人的天堂| 美女国产一区| 亚洲影院高清在线| 欧美美女喷水视频| 亚洲国产精品电影| 久久av老司机精品网站导航| 亚洲欧洲日产国产网站| 久久久久国内| 国产欧美日韩不卡| 亚洲欧美国产精品桃花 | 久久国产精品久久久久久| 免费久久99精品国产自| 一本一本久久a久久精品综合麻豆| 久久精品二区三区| 国产精品欧美经典| 亚洲美女av电影| 欧美11—12娇小xxxx| 久久精品2019中文字幕| 国产精品天美传媒入口| 一区二区三区高清不卡| 欧美激情精品| 男女精品视频| 亚洲黄色有码视频| 欧美成人午夜免费视在线看片 | 日韩五码在线| 欧美久久久久久蜜桃| 日韩亚洲欧美成人| 亚洲电影在线| 欧美韩日一区二区三区| 91久久精品一区| 亚洲激情视频在线| 欧美激情一二三区| 中文日韩电影网站| 亚洲综合色视频| 国产综合精品一区| 欧美mv日韩mv国产网站| 美女脱光内衣内裤视频久久网站| 悠悠资源网亚洲青| 欧美激情精品久久久六区热门| 免播放器亚洲| 亚洲视频在线观看网站| 亚洲一区日本| 激情视频一区| 亚洲人成在线观看| 欧美三级中文字幕在线观看| 亚洲综合电影一区二区三区| 亚洲欧美日韩国产中文在线| 好看不卡的中文字幕| 亚洲国产精品va在线看黑人动漫 | 欧美亚洲免费在线| 亚洲成人资源| 亚洲人屁股眼子交8| 国产精品激情av在线播放| 欧美影院在线播放| 可以看av的网站久久看| 一本久久综合| 午夜在线成人av| 亚洲日韩欧美一区二区在线| 在线视频欧美日韩精品| 国产亚洲亚洲| 亚洲毛片在线观看| 国产色综合久久| 最近看过的日韩成人| 国产日韩1区| 亚洲精品国产精品久久清纯直播| 国产精品日韩欧美一区二区三区 | 久久久视频精品| 狠狠狠色丁香婷婷综合久久五月 | 欧美午夜精品久久久久免费视| 亚洲伊人网站| 久久精品国产精品亚洲| 一区二区欧美视频| 久久国产精品久久久久久电车| 日韩一级片网址| 久久国产精品一区二区三区四区 | 欧美成人免费在线观看| 国产精品二区二区三区| 亚洲大胆人体在线| 国产欧美日韩视频| 日韩视频在线免费| 在线色欧美三级视频| 亚洲一区二区三区三| 日韩一级欧洲| 蜜臀av国产精品久久久久| 欧美中文字幕视频| 欧美婷婷久久| 亚洲理论在线| 亚洲精品一区中文| 麻豆91精品| 美女脱光内衣内裤视频久久网站| 国产精品夜夜夜| 中文av字幕一区| 一区二区日韩免费看| 欧美成人中文| 亚洲电影免费观看高清| 激情综合色综合久久综合| 亚洲欧美在线一区| 午夜精品一区二区三区电影天堂 | 亚洲综合精品一区二区| 欧美国产综合视频| 亚洲欧洲日本mm| 亚洲欧洲一区二区三区在线观看| 欧美主播一区二区三区| 久久国产精品99国产| 国产精品丝袜91| 亚洲一区二区高清| 亚洲欧美一区二区三区极速播放| 欧美日韩伦理在线免费| 亚洲欧洲一区二区在线观看| 亚洲精品专区| 欧美日韩爆操| 一区二区欧美国产| 午夜欧美电影在线观看| 国产精品欧美风情| 亚洲综合第一页| 久久久夜夜夜| 91久久综合亚洲鲁鲁五月天| 欧美激情精品久久久久久| 亚洲免费观看高清完整版在线观看熊 | 亚洲视频精选在线| 欧美亚洲三区| 国产啪精品视频| 久久激情五月激情| 欧美风情在线观看| 亚洲深夜福利网站| 国产亚洲一区二区精品| 欧美一区二区三区在线| 在线日韩欧美| 欧美第一黄色网| 一本色道久久| 久久gogo国模裸体人体| 精品成人国产| 欧美日产一区二区三区在线观看| 亚洲视频欧美视频| 免费久久99精品国产| 日韩视频免费在线| 国产乱码精品1区2区3区| 欧美在线免费播放| 亚洲欧洲三级| 久久激情五月丁香伊人| 亚洲国产综合在线看不卡| 欧美午夜视频网站| 麻豆精品一区二区av白丝在线| 亚洲美女视频| 久久亚洲二区| 亚洲一区二区视频在线| 影音先锋亚洲精品| 国产精品―色哟哟| 欧美激情精品久久久久久变态| 性欧美8khd高清极品| 亚洲欧洲精品一区二区精品久久久| 小黄鸭精品密入口导航| 亚洲狼人综合| 一区二区三区在线视频免费观看| 欧美日韩在线另类| 米奇777超碰欧美日韩亚洲| 一区二区三区黄色| 亚洲欧洲精品一区二区三区不卡| 欧美在线国产精品| av不卡免费看| 亚洲精品视频在线播放| 国产一区 二区 三区一级| 欧美日韩在线电影| 欧美精品导航| 免费欧美日韩| 久久视频在线看| 欧美在线高清| 亚洲欧美综合v| 亚洲午夜日本在线观看| 亚洲日本中文|