• <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 閱讀(202) 評論(0)  編輯 收藏 引用 所屬分類: C/C++
            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            常用鏈接

            留言簿

            隨筆檔案

            文章分類

            文章檔案

            收藏夾

            常去的壇子

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

            我的朋友

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

            搜索

            •  

            最新評論

            亚洲精品国产自在久久| 久久久久这里只有精品| 丁香色欲久久久久久综合网| 久久久噜噜噜久久| 2021国内久久精品| 色偷偷久久一区二区三区| 99久久中文字幕| 亚洲国产天堂久久综合| 2020久久精品亚洲热综合一本| 久久精品国产2020| 国产精品成人99久久久久91gav| 久久久中文字幕日本| 亚洲人成精品久久久久| 久久国产福利免费| 人妻精品久久无码区| 久久97久久97精品免视看| 麻豆AV一区二区三区久久| 国产精品99久久久久久董美香| 综合久久国产九一剧情麻豆| 激情综合色综合久久综合| 久久久噜噜噜久久中文福利| 人妻系列无码专区久久五月天| 高清免费久久午夜精品| 久久中文字幕人妻丝袜| 久久青青国产| 精品久久久久久无码国产 | 国产精品亚洲美女久久久| 久久久久免费精品国产| 久久久久久国产a免费观看不卡| 国产午夜久久影院| 精品国产一区二区三区久久久狼| 亚洲精品无码久久不卡| 久久婷婷人人澡人人| 欧美伊人久久大香线蕉综合69 | 国产精品亚洲美女久久久| 欧美日韩中文字幕久久伊人| 色综合久久无码中文字幕| 77777亚洲午夜久久多喷| 国产美女亚洲精品久久久综合| 性做久久久久久久久| 国产精品久久久久久久人人看|