• <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>
            posts - 101,  comments - 57,  trackbacks - 0
                  說起來還真是慚愧,如此簡單的問題一直就沒有太注意。今天偶爾才開始關注。

            #include <iostream>
            using namespace std;

            class CBase
            {
            public:
                CBase()
                
            {
                    cout
            <<"I in Base constructor"<<endl;
                }

                
            virtual ~CBase()
                
            {
                    cout
            <<"I in Base deconstructor"<<endl;
                }

            }
            ;

            class CDerived : public CBase
            {
            public:
                CDerived()
                
            {
                    cout
            <<"I in CDerived constructor"<<endl;
                }

                
            virtual ~CDerived()
                
            {
                    cout
            <<"I in CDerived deconstructor"<<endl;
                }

            }
            ;


            int main()
            {

                CBase 
            *pBase = new CDerived();
                delete pBase;

                
            return 0;
            }


            輸出結果

            I in Base constructor
            I in CDerived constructor
            I in CDerived deconstructor
            I in Base deconstructor

                  以前一直覺得virtual的指定是可有可無的,現在才知道,如果不制定virutal,那么I in CDerived deconstructor就不會調用。這個與construtor完全不一樣,事實上也正是這樣把他/它忽略了。

                  接著就要想想如何實現的呢?

            先來看看構造函數
            004012CF   .  894D F0       mov     [ebp-10], ecx
            004012D2   .  8B4D F0       mov     ecx, [ebp-10]
            004012D5   .  E8 D0FDFFFF   call    004010AA                                    ; 調用基類的構造函數
            004012DA   .  C745 FC 00000>mov     dword ptr [ebp-4], 0
            004012E1   .  8B45 F0       mov     eax, [ebp-10]
            004012E4   .  C700 3C204300 mov     dword ptr [eax], offset CDerived::`vftable'
            004012EA   .  68 2D104000   push    0040102D
            004012EF   .  68 1C204300   push    0043201C                                       ;  ASCII "I in CDerived constructor"
            004012F4   .  68 40954300   push    offset std::cout
            004012F9   .  E8 CAFDFFFF   call    004010C8
            和以前理解的一樣,不多解釋

            下面是析構函數(注意這里是CDerived生成的delete函數哦)

            00401069   . /E9 32040000   jmp     CDerived::`scalar deleting destructor'

            004014BA  |.  894D FC       mov     [ebp-4], ecx
            004014BD  |.  8B4D FC       mov     ecx, [ebp-4]
            004014C0  |.  E8 F9FBFFFF   call    004010BE                              ; 調用子類的析構函數
            004014C5  |.  8B45 08       mov     eax, [ebp+8]
            004014C8  |.  83E0 01       and     eax, 1
            004014CB  |.  85C0          test    eax, eax
            004014CD  |.  74 0C         je      short 004014DB
            004014CF  |.  8B4D FC       mov     ecx, [ebp-4]
            004014D2  |.  51            push    ecx                                            ; /Arg1
            004014D3  |.  E8 A8130000   call    operator delete                                ; \operator delete

            0040153F   .  894D F0       mov     [ebp-10], ecx
            00401542   .  8B45 F0       mov     eax, [ebp-10]
            00401545   .  C700 3C204300 mov     dword ptr [eax], offset CDerived::`vftable'
            0040154B   .  C745 FC 00000>mov     dword ptr [ebp-4], 0
            00401552   .  68 2D104000   push    0040102D
            00401557   .  68 80204300   push    00432080                                       ;  ASCII "I in CDerived disconstructor"
            0040155C   .  68 40954300   push    offset std::cout
            00401561   .  E8 62FBFFFF   call    004010C8
            00401566   .  83C4 08       add     esp, 8
            00401569   .  8BC8          mov     ecx, eax
            0040156B   .  E8 1CFBFFFF   call    0040108C
            00401570   .  C745 FC FFFFF>mov     dword ptr [ebp-4], -1
            00401577   .  8B4D F0       mov     ecx, [ebp-10]
            0040157A   .  E8 E0FAFFFF   call    0040105F                                       ; 基類的析構函數

            結論:
            編譯器不能自動識別析構函數,必須要多態的標識。

            posted on 2008-05-31 12:32 margin 閱讀(201) 評論(0)  編輯 收藏 引用 所屬分類: C/C++
            <2010年9月>
            2930311234
            567891011
            12131415161718
            19202122232425
            262728293012
            3456789

            常用鏈接

            留言簿

            隨筆檔案

            文章分類

            文章檔案

            收藏夾

            常去的壇子

            • CVC電腦病毒論壇
            • 很多人說我是AV,我告訴他們:別瞧不起人,我們也能創造價值
            • 安全焦點
            • 黑客聚集的地方,一般是好酒最多的地方...
            • 看雪論壇
            • 國內最強的加密解密論壇,成醉其中經常夜不歸宿
            • 驅動開發論壇
            • 厭倦了啤的朋友們,來我們來整點白的...痛痛快快的BSOD也好過隔鞋瘙癢!

            我的朋友

            • Sen的blog
            • IDE方面資深的受害者...經常為一個變量的定義找不著北的痛苦程序員(深表同情)
            • 老羅的blog
            • 良師益友,千年水牛,引擎猛男,分析怪獸,墨鏡酷哥,臺球高手....

            搜索

            •  

            最新評論

            无码超乳爆乳中文字幕久久| 国产成人精品综合久久久| 久久棈精品久久久久久噜噜| 久久久国产99久久国产一| 久久精品久久久久观看99水蜜桃| 亚洲欧美伊人久久综合一区二区 | 伊人久久国产免费观看视频| 无码专区久久综合久中文字幕| 成人资源影音先锋久久资源网| 久久99精品久久久久久野外| 亚洲欧美日韩久久精品第一区| 久久99国产精品久久| 久久精品国产亚洲AV久| 91久久精品电影| 久久久久久亚洲AV无码专区| 久久久99精品成人片中文字幕| 国内精品伊人久久久久AV影院| 久久久精品久久久久久| 久久se精品一区二区| 中文国产成人精品久久不卡| 久久婷婷五月综合色99啪ak| 久久久久人妻一区精品色| 久久久国产99久久国产一| www亚洲欲色成人久久精品| 久久丫精品国产亚洲av不卡| 欧美亚洲国产精品久久| 亚洲国产一成久久精品国产成人综合| 91精品国产综合久久久久久| 国产A三级久久精品| 狠狠色丁香久久婷婷综合_中 | 国产精品久久久久jk制服| 亚洲精品午夜国产va久久| 色综合久久久久综合99| 久久男人中文字幕资源站| 日本加勒比久久精品| 久久久艹| 久久久久久久久久久| 亚洲va中文字幕无码久久| 久久婷婷五月综合97色| 久久久久久亚洲AV无码专区| 国产精品美女久久久m|