• <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
            • 良師益友,千年水牛,引擎猛男,分析怪獸,墨鏡酷哥,臺球高手....

            搜索

            •  

            最新評論

            亚洲伊人久久大香线蕉综合图片 | 欧美久久久久久午夜精品| 久久r热这里有精品视频| 久久免费精品视频| 久久笫一福利免费导航 | 亚洲精品乱码久久久久久蜜桃| 久久久精品波多野结衣| 99精品国产99久久久久久97| 国产精品无码久久综合| 久久精品国产精品亜洲毛片| 精品国产乱码久久久久久呢 | 香蕉久久永久视频| 久久精品国产99国产精偷| 久久人人爽人人爽人人片av麻烦| 久久国产免费观看精品3| 亚洲精品无码久久不卡| 国产精品成人久久久久久久| 精品综合久久久久久97| 久久午夜无码鲁丝片午夜精品| 久久国产色AV免费看| 99久久夜色精品国产网站| 国产成人精品久久亚洲高清不卡 | 亚洲国产另类久久久精品小说| 99久久婷婷国产综合精品草原| 久久精品欧美日韩精品| 综合久久精品色| 久久综合一区二区无码| 国产L精品国产亚洲区久久| a级成人毛片久久| 国内精品久久久久影院一蜜桃| 国产精品99久久久精品无码| 久久久久人妻精品一区三寸蜜桃| 久久国产精品久久精品国产| 久久久久亚洲av无码专区导航 | 伊人久久大香线焦AV综合影院| 色偷偷91久久综合噜噜噜噜| 久久久青草青青国产亚洲免观| 久久精品国产亚洲Aⅴ香蕉| 99久久亚洲综合精品成人| 亚洲国产精品久久| 国内精品久久久久久久久|