cpp反汇编之共同继承一个父类

来源:互联网 发布:淘宝网积分怎么用 编辑:程序博客网 时间:2024/05/16 19:07

先拿出源代码

#include<stdio.h>class CPerson{public:CPerson(){ShowSpeak();}virtual ~CPerson(){ShowSpeak();}virtual void ShowSpeak(){printf("%s::ShowSpeak()\r\n" , GetClassName());}virtual char * GetClassName(){return "CPerson";}};class CChinese : public CPerson{public:CChinese(){ShowSpeak();}virtual ~CChinese(){ShowSpeak();}//virtual void ShowSpeak()//{//printf("Speak Chinese\n");//}virtual char * GetClassName(){return "CChinese";}};class CAmerican : public CPerson{public:CAmerican(){ShowSpeak();}virtual ~CAmerican(){ShowSpeak();}/*virtual void ShowSpeak(){printf("Speak American\n");}*/virtual char * GetClassName(){return "CAmerican";}};class CGerman : public CPerson{public:CGerman(){ShowSpeak();}virtual ~CGerman(){ShowSpeak();}/*virtual void ShowSpeak(){printf("Speak German\n");}*/virtual char * GetClassName(){return "CGerman";}};void speak(CPerson *pPerson){pPerson->ShowSpeak();}int main(){CChinese Chinese;CAmerican American;CGerman German;//speak(&Chinese);//speak(&American);//speak(&German);return 0;}

下面是反汇编分析

@ILT+0(??_ECGerman@@UAEPAXI@Z):00401005   jmp         CGerman::`scalar deleting destructor' (00401ba0)@ILT+5(??_ECAmerican@@UAEPAXI@Z):0040100A   jmp         CAmerican::`scalar deleting destructor' (00401a30)@ILT+10(?SetNumber@CBase@@QAEXH@Z):0040100F   jmp         CBase::SetNumber (00401280)@ILT+15(??1CBase@@QAE@XZ):00401014   jmp         CBase::~CBase (004013f0)@ILT+20(?ShowSpeak@CChinese@@UAEXXZ):00401019   jmp         CChinese::ShowSpeak (00401870)@ILT+25(?ShowNumber@CDerive@@QAEXH@Z):0040101E   jmp         CDerive::ShowNumber (004011f0)@ILT+30(??0CGerman@@QAE@XZ):00401023   jmp         CGerman::CGerman (00401aa0)@ILT+35(??0CAmerican@@QAE@XZ):00401028   jmp         CAmerican::CAmerican (00401930)@ILT+40(??0CChinese@@QAE@XZ):0040102D   jmp         CChinese::CChinese (00401650)@ILT+45(?ShowSpeak@CPerson@@UAEXXZ):00401032   jmp         CPerson::ShowSpeak (00401710)@ILT+50(??1CPerson@@UAE@XZ):00401037   jmp         CPerson::~CPerson (004017d0)@ILT+55(??_ECPerson@@UAEPAXI@Z):0040103C   jmp         CPerson::`scalar deleting destructor' (00401760)@ILT+60(?GetNumber@CBase@@QAEHXZ):00401041   jmp         CBase::GetNumber (004012c0)@ILT+65(??0CDerive@@QAE@XZ):00401046   jmp         CDerive::CDerive (00401300)@ILT+70(??1CGerman@@UAE@XZ):0040104B   jmp         CGerman::~CGerman (00401b00)@ILT+75(??_ECGerman@@UAEPAXI@Z):00401050   jmp         CGerman::`scalar deleting destructor' (00401ba0)@ILT+80(??1CDerive@@QAE@XZ):00401055   jmp         CDerive::~CDerive (004013a0)@ILT+85(??0CPerson@@QAE@XZ):0040105A   jmp         CPerson::CPerson (004016b0)@ILT+90(??_ECChinese@@UAEPAXI@Z):0040105F   jmp         CChinese::`scalar deleting destructor' (004018c0)@ILT+95(??1CAmerican@@UAE@XZ):00401064   jmp         CAmerican::~CAmerican (00401990)@ILT+100(?main2@@YAHXZ):00401069   jmp         main2 (004014c0)@ILT+105(??1CChinese@@UAE@XZ):0040106E   jmp         CChinese::~CChinese (00401820)@ILT+110(?ShowSpeak@CAmerican@@UAEXXZ):00401073   jmp         CAmerican::ShowSpeak (004019e0)@ILT+115(?ShowSpeak@CGerman@@UAEXXZ):00401078   jmp         CGerman::ShowSpeak (00401b50)@ILT+120(_main):0040107D   jmp         main (00401550)@ILT+125(??0CBase@@QAE@XZ):00401082   jmp         CBase::CBase (00401350)@ILT+130(?main3@@YAHXZ):00401087   jmp         main3 (00401440)@ILT+135(?main1@@YAHHQAPAD@Z):0040108C   jmp         main1 (00401150)@ILT+140(??_ECAmerican@@UAEPAXI@Z):00401091   jmp         CAmerican::`scalar deleting destructor' (00401a30)@ILT+145(?speak@@YAXPAVCPerson@@@Z):00401096   jmp         speak (00401500)@ILT+150(??_ECPerson@@UAEPAXI@Z):0040109B   jmp         CPerson::`scalar deleting destructor' (00401760)@ILT+155(??_ECChinese@@UAEPAXI@Z):004010A0   jmp         CChinese::`scalar deleting destructor' (004018c0)1:    #include<stdio.h>2:    class CPerson3:    {4:    public:5:        CPerson()004016B0   push        ebp004016B1   mov         ebp,esp004016B3   sub         esp,44h004016B6   push        ebx004016B7   push        esi004016B8   push        edi004016B9   push        ecx004016BA   lea         edi,[ebp-44h]004016BD   mov         ecx,11h004016C2   mov         eax,0CCCCCCCCh004016C7   rep stos    dword ptr [edi]004016C9   pop         ecx004016CA   mov         dword ptr [ebp-4],ecx004016CD   mov         eax,dword ptr [ebp-4]004016D0   mov         dword ptr [eax],offset CPerson::`vftable' (00425044)     <strong>因为有虚函数所以有默认构造函数</strong>6:        {7:            ShowSpeak();004016D6   mov         ecx,dword ptr [ebp-4]004016D9   call        @ILT+45(CPerson::ShowSpeak) (00401032)8:        }004016DE   mov         eax,dword ptr [ebp-4]004016E1   pop         edi004016E2   pop         esi004016E3   pop         ebx004016E4   add         esp,44h004016E7   cmp         ebp,esp004016E9   call        __chkesp (00401ff0)004016EE   mov         esp,ebp004016F0   pop         ebp004016F1   ret17:   };18:19:   class CChinese : public CPerson20:   {21:   public:22:       CChinese()00401650   push        ebp00401651   mov         ebp,esp00401653   sub         esp,44h00401656   push        ebx00401657   push        esi00401658   push        edi00401659   push        ecx0040165A   lea         edi,[ebp-44h]0040165D   mov         ecx,11h00401662   mov         eax,0CCCCCCCCh00401667   rep stos    dword ptr [edi]00401669   pop         ecx0040166A   mov         dword ptr [ebp-4],ecx0040166D   mov         ecx,dword ptr [ebp-4]00401670   call        @ILT+85(CPerson::CPerson) (0040105a)//此处调用虚函数是父类的。00401675   mov         eax,dword ptr [ebp-4]00401678   mov         dword ptr [eax],offset CChinese::`vftable' (00425038)23:       {24:25:       }0040167E   mov         eax,dword ptr [ebp-4]00401681   pop         edi00401682   pop         esi00401683   pop         ebx00401684   add         esp,44h00401687   cmp         ebp,esp00401689   call        __chkesp (00401ff0)0040168E   mov         esp,ebp00401690   pop         ebp00401691   ret34:   };35:36:   class CAmerican : public CPerson37:   {38:   public:39:       CAmerican()00401930   push        ebp00401931   mov         ebp,esp00401933   sub         esp,44h00401936   push        ebx00401937   push        esi00401938   push        edi00401939   push        ecx0040193A   lea         edi,[ebp-44h]0040193D   mov         ecx,11h00401942   mov         eax,0CCCCCCCCh00401947   rep stos    dword ptr [edi]00401949   pop         ecx0040194A   mov         dword ptr [ebp-4],ecx0040194D   mov         ecx,dword ptr [ebp-4]00401950   call        @ILT+85(CPerson::CPerson) (0040105a)00401955   mov         eax,dword ptr [ebp-4]00401958   mov         dword ptr [eax],offset CAmerican::`vftable' (00425074)40:       {41:42:       }0040195E   mov         eax,dword ptr [ebp-4]00401961   pop         edi00401962   pop         esi00401963   pop         ebx00401964   add         esp,44h00401967   cmp         ebp,esp00401969   call        __chkesp (00401ff0)0040196E   mov         esp,ebp00401970   pop         ebp00401971   ret72:   int main()73:   {00401550   push        ebp00401551   mov         ebp,esp00401553   push        0FFh00401555   push        offset __ehhandler$_main (00413dab)0040155A   mov         eax,fs:[00000000]00401560   push        eax00401561   mov         dword ptr fs:[0],esp00401568   sub         esp,50h0040156B   push        ebx0040156C   push        esi0040156D   push        edi0040156E   lea         edi,[ebp-5Ch]00401571   mov         ecx,14h00401576   mov         eax,0CCCCCCCCh0040157B   rep stos    dword ptr [edi]74:       CChinese Chinese;0040157D   lea         ecx,[ebp-10h]00401580   call        @ILT+40(CChinese::CChinese) (0040102d)00401585   mov         dword ptr [ebp-4],075:       CAmerican American;0040158C   lea         ecx,[ebp-14h]0040158F   call        @ILT+35(CAmerican::CAmerican) (00401028)00401594   mov         byte ptr [ebp-4],176:       CGerman German;00401598   lea         ecx,[ebp-18h]0040159B   call        @ILT+30(CGerman::CGerman) (00401023)004015A0   mov         byte ptr [ebp-4],277:       speak(&Chinese);004015A4   lea         eax,[ebp-10h]004015A7   push        eax004015A8   call        @ILT+145(speak) (00401096)004015AD   add         esp,478:       speak(&American);004015B0   lea         ecx,[ebp-14h]004015B3   push        ecx004015B4   call        @ILT+145(speak) (00401096)004015B9   add         esp,479:       speak(&German);004015BC   lea         edx,[ebp-18h]004015BF   push        edx004015C0   call        @ILT+145(speak) (00401096)004015C5   add         esp,480:       return 0;004015C8   mov         dword ptr [ebp-1Ch],0004015CF   mov         byte ptr [ebp-4],1004015D3   lea         ecx,[ebp-18h]004015D6   call        @ILT+70(CGerman::~CGerman) (0040104b)004015DB   mov         byte ptr [ebp-4],0004015DF   lea         ecx,[ebp-14h]004015E2   call        @ILT+95(CAmerican::~CAmerican) (00401064)004015E7   mov         dword ptr [ebp-4],0FFFFFFFFh004015EE   lea         ecx,[ebp-10h]004015F1   call        @ILT+105(CChinese::~CChinese) (0040106e)004015F6   mov         eax,dword ptr [ebp-1Ch]81:   }004015F9   mov         ecx,dword ptr [ebp-0Ch]004015FC   mov         dword ptr fs:[0],ecx00401603   pop         edi00401604   pop         esi00401605   pop         ebx00401606   add         esp,5Ch00401609   cmp         ebp,esp0040160B   call        __chkesp (00401ff0)00401610   mov         esp,ebp00401612   pop         ebp00401613   ret59:       virtual ~CGerman()60:       {0040F6E0   push        ebp0040F6E1   mov         ebp,esp0040F6E3   push        0FFh0040F6E5   push        offset __ehhandler$??1CGerman@@UAE@XZ (00413dc9)0040F6EA   mov         eax,fs:[00000000]0040F6F0   push        eax0040F6F1   mov         dword ptr fs:[0],esp0040F6F8   sub         esp,44h0040F6FB   push        ebx0040F6FC   push        esi0040F6FD   push        edi0040F6FE   push        ecx0040F6FF   lea         edi,[ebp-50h]0040F702   mov         ecx,11h0040F707   mov         eax,0CCCCCCCCh0040F70C   rep stos    dword ptr [edi]0040F70E   pop         ecx0040F70F   mov         dword ptr [ebp-10h],ecx0040F712   mov         eax,dword ptr [ebp-10h]0040F715   mov         dword ptr [eax],offset CGerman::`vftable' (00425094)还原虚表0040F71B   mov         dword ptr [ebp-4],061:           ShowSpeak();//执行子类虚函数体0040F722   mov         ecx,dword ptr [ebp-10h]0040F725   call        @ILT+115(CGerman::ShowSpeak) (00401078)62:       }0040F72A   mov         dword ptr [ebp-4],0FFFFFFFFh0040F731   mov         ecx,dword ptr [ebp-10h]0040F734   call        @ILT+50(CPerson::~CPerson) (00401037)继续调用父类析构函数0040F739   mov         ecx,dword ptr [ebp-0Ch]0040F73C   mov         dword ptr fs:[0],ecx0040F743   pop         edi0040F744   pop         esi0040F745   pop         ebx0040F746   add         esp,50h0040F749   cmp         ebp,esp0040F74B   call        __chkesp (00401ff0)0040F750   mov         esp,ebp0040F752   pop         ebp0040F753   ret43:       virtual ~CAmerican()44:       {00401990   push        ebp00401991   mov         ebp,esp00401993   sub         esp,44h00401996   push        ebx00401997   push        esi00401998   push        edi00401999   push        ecx0040199A   lea         edi,[ebp-44h]0040199D   mov         ecx,11h004019A2   mov         eax,0CCCCCCCCh004019A7   rep stos    dword ptr [edi]004019A9   pop         ecx004019AA   mov         dword ptr [ebp-4],ecx004019AD   mov         eax,dword ptr [ebp-4]004019B0   mov         dword ptr [eax],offset CAmerican::`vftable' (00425074)45:46:       }004019B6   mov         ecx,dword ptr [ebp-4]004019B9   call        @ILT+50(CPerson::~CPerson) (00401037)004019BE   pop         edi004019BF   pop         esi004019C0   pop         ebx004019C1   add         esp,44h004019C4   cmp         ebp,esp004019C6   call        __chkesp (00401ff0)004019CB   mov         esp,ebp004019CD   pop         ebp004019CE   ret稍作修改后:@ILT+0(??_ECGerman@@UAEPAXI@Z):00401005   jmp         CGerman::`scalar deleting destructor' (0040f730)@ILT+5(??_GCAmerican@@UAEPAXI@Z):0040100A   jmp         CAmerican::`scalar deleting destructor' (00401aa0)@ILT+10(?SetNumber@CBase@@QAEXH@Z):0040100F   jmp         CBase::SetNumber (00401280)@ILT+15(??1CBase@@QAE@XZ):00401014   jmp         CBase::~CBase (004013f0)@ILT+20(?ShowSpeak@CChinese@@UAEXXZ):00401019   jmp         CChinese::~CChinese (00401870)@ILT+25(?ShowNumber@CDerive@@QAEXH@Z):0040101E   jmp         CDerive::ShowNumber (004011f0)@ILT+30(??0CGerman@@QAE@XZ):00401023   jmp         CGerman::CGerman (0040f6e0)@ILT+35(??0CAmerican@@QAE@XZ):00401028   jmp         CAmerican::CAmerican (00401990)@ILT+40(??0CChinese@@QAE@XZ):0040102D   jmp         CChinese::CChinese (00401650)@ILT+45(?ShowSpeak@CPerson@@UAEXXZ):00401032   jmp         CPerson::ShowSpeak (00401710)@ILT+50(??1CPerson@@UAE@XZ):00401037   jmp         CPerson::~CPerson (00401820)@ILT+55(??_GCPerson@@UAEPAXI@Z):0040103C   jmp         CPerson::`scalar deleting destructor' (00401790)@ILT+60(?GetNumber@CBase@@QAEHXZ):00401041   jmp         CBase::GetNumber (004012c0)@ILT+65(??0CDerive@@QAE@XZ):00401046   jmp         CDerive::CDerive (00401300)@ILT+70(??1CGerman@@UAE@XZ):0040104B   jmp         CGerman::~CGerman (00401b00)@ILT+75(??_ECGerman@@UAEPAXI@Z):00401050   jmp         CGerman::`scalar deleting destructor' (0040f730)@ILT+80(??1CDerive@@QAE@XZ):00401055   jmp         CDerive::~CDerive (004013a0)@ILT+85(??0CPerson@@QAE@XZ):0040105A   jmp         CPerson::CPerson (004016b0)@ILT+90(??_ECChinese@@UAEPAXI@Z):0040105F   jmp         CChinese::`scalar deleting destructor' (00401930)@ILT+95(??1CAmerican@@UAE@XZ):00401064   jmp         CAmerican::~CAmerican (004019e0)@ILT+100(?main2@@YAHXZ):00401069   jmp         main2 (004014c0)@ILT+105(?ShowSpeak@CChinese@@UAEXXZ):0040106E   jmp         CChinese::~CChinese (00401870)@ILT+110(??1CAmerican@@UAE@XZ):00401073   jmp         CAmerican::~CAmerican (004019e0)@ILT+115(?ShowSpeak@CGerman@@UAEXXZ):00401078   jmp         CGerman::~CGerman+50h (00401b50)@ILT+120(_main):0040107D   jmp         main (00401550)@ILT+125(??0CBase@@QAE@XZ):00401082   jmp         CBase::CBase (00401350)@ILT+130(?main3@@YAHXZ):00401087   jmp         main3 (00401440)@ILT+135(?main1@@YAHHQAPAD@Z):0040108C   jmp         main1 (00401150)@ILT+140(??_GCAmerican@@UAEPAXI@Z):00401091   jmp         CAmerican::`scalar deleting destructor' (00401aa0)@ILT+145(?speak@@YAXPAVCPerson@@@Z):00401096   jmp         speak (00401500)@ILT+150(??_GCPerson@@UAEPAXI@Z):0040109B   jmp         CPerson::`scalar deleting destructor' (00401790)@ILT+155(??_ECChinese@@UAEPAXI@Z):004010A0   jmp         CChinese::`scalar deleting destructor' (00401930)004010A5   jmp         CChinese::GetClassName (004018c0)004010AA   jmp         CGerman::GetClassName (00401ba0)004010AF   jmp         CPerson::GetClassName (00401760)004010B4   jmp         CAmerican::GetClassName (00401a30)1:    #include<stdio.h>2:    class CPerson3:    {4:    public:5:        CPerson()004016B0   push        ebp004016B1   mov         ebp,esp004016B3   sub         esp,44h004016B6   push        ebx004016B7   push        esi004016B8   push        edi004016B9   push        ecx004016BA   lea         edi,[ebp-44h]004016BD   mov         ecx,11h004016C2   mov         eax,0CCCCCCCCh004016C7   rep stos    dword ptr [edi]004016C9   pop         ecx004016CA   mov         dword ptr [ebp-4],ecx004016CD   mov         eax,dword ptr [ebp-4]004016D0   mov         dword ptr [eax],offset CPerson::`vftable' (00425044)6:        {7:            ShowSpeak();004016D6   mov         ecx,dword ptr [ebp-4]004016D9   call        @ILT+45(CPerson::ShowSpeak) (00401032)8:        }004016DE   mov         eax,dword ptr [ebp-4]004016E1   pop         edi004016E2   pop         esi004016E3   pop         ebx004016E4   add         esp,44h004016E7   cmp         ebp,esp004016E9   call        __chkesp (00401ff0)004016EE   mov         esp,ebp004016F0   pop         ebp004016F1   ret9:        virtual ~CPerson()10:       {00401820   push        ebp00401821   mov         ebp,esp00401823   sub         esp,44h00401826   push        ebx00401827   push        esi00401828   push        edi00401829   push        ecx0040182A   lea         edi,[ebp-44h]0040182D   mov         ecx,11h00401832   mov         eax,0CCCCCCCCh00401837   rep stos    dword ptr [edi]00401839   pop         ecx0040183A   mov         dword ptr [ebp-4],ecx0040183D   mov         eax,dword ptr [ebp-4]00401840   mov         dword ptr [eax],offset CPerson::`vftable' (00425044)11:           ShowSpeak();00401846   mov         ecx,dword ptr [ebp-4]00401849   call        @ILT+45(CPerson::ShowSpeak) (00401032)12:       }0040184E   pop         edi0040184F   pop         esi00401850   pop         ebx00401851   add         esp,44h00401854   cmp         ebp,esp00401856   call        __chkesp (00401ff0)0040185B   mov         esp,ebp0040185D   pop         ebp0040185E   ret13:       virtual void ShowSpeak()14:       {00401710   push        ebp00401711   mov         ebp,esp00401713   sub         esp,44h00401716   push        ebx00401717   push        esi00401718   push        edi00401719   push        ecx0040171A   lea         edi,[ebp-44h]0040171D   mov         ecx,11h00401722   mov         eax,0CCCCCCCCh00401727   rep stos    dword ptr [edi]00401729   pop         ecx0040172A   mov         dword ptr [ebp-4],ecx15:           printf("%s::ShowSpeak()\r\n" , GetClassName());0040172D   mov         eax,dword ptr [ebp-4]00401730   mov         edx,dword ptr [eax]00401732   mov         esi,esp00401734   mov         ecx,dword ptr [ebp-4]00401737   call        dword ptr [edx+8]0040173A   cmp         esi,esp0040173C   call        __chkesp (00401ff0)00401741   push        eax00401742   push        offset string "%s::ShowSpeak()\r\n" (004260b8)00401747   call        printf (00402120)0040174C   add         esp,816:       }0040174F   pop         edi00401750   pop         esi00401751   pop         ebx00401752   add         esp,44h00401755   cmp         ebp,esp00401757   call        __chkesp (00401ff0)0040175C   mov         esp,ebp0040175E   pop         ebp0040175F   ret17:       virtual char * GetClassName()18:       {00401760   push        ebp00401761   mov         ebp,esp00401763   sub         esp,44h00401766   push        ebx00401767   push        esi00401768   push        edi00401769   push        ecx0040176A   lea         edi,[ebp-44h]0040176D   mov         ecx,11h00401772   mov         eax,0CCCCCCCCh00401777   rep stos    dword ptr [edi]00401779   pop         ecx0040177A   mov         dword ptr [ebp-4],ecx19:           return "CPerson";0040177D   mov         eax,offset string "CPerson" (00425060)20:       }00401782   pop         edi00401783   pop         esi00401784   pop         ebx00401785   mov         esp,ebp00401787   pop         ebp00401788   ret21:   };22:23:   class CChinese : public CPerson24:   {25:   public:26:       CChinese()00401650   push        ebp00401651   mov         ebp,esp00401653   sub         esp,44h00401656   push        ebx00401657   push        esi00401658   push        edi00401659   push        ecx0040165A   lea         edi,[ebp-44h]0040165D   mov         ecx,11h00401662   mov         eax,0CCCCCCCCh00401667   rep stos    dword ptr [edi]00401669   pop         ecx0040166A   mov         dword ptr [ebp-4],ecx0040166D   mov         ecx,dword ptr [ebp-4]00401670   call        @ILT+85(CPerson::CPerson) (0040105a)00401675   mov         eax,dword ptr [ebp-4]00401678   mov         dword ptr [eax],offset CChinese::`vftable' (00425038)27:       {28:29:       }0040167E   mov         eax,dword ptr [ebp-4]00401681   pop         edi00401682   pop         esi00401683   pop         ebx00401684   add         esp,44h00401687   cmp         ebp,esp00401689   call        __chkesp (00401ff0)0040168E   mov         esp,ebp00401690   pop         ebp00401691   ret30:       virtual ~CChinese()31:       {00401870   push        ebp00401871   mov         ebp,esp00401873   sub         esp,44h00401876   push        ebx00401877   push        esi00401878   push        edi00401879   push        ecx0040187A   lea         edi,[ebp-44h]0040187D   mov         ecx,11h00401882   mov         eax,0CCCCCCCCh00401887   rep stos    dword ptr [edi]00401889   pop         ecx0040188A   mov         dword ptr [ebp-4],ecx0040188D   mov         eax,dword ptr [ebp-4]00401890   mov         dword ptr [eax],offset CChinese::`vftable' (00425038)32:33:       }00401896   mov         ecx,dword ptr [ebp-4]00401899   call        @ILT+50(CPerson::~CPerson) (00401037)0040189E   pop         edi0040189F   pop         esi004018A0   pop         ebx004018A1   add         esp,44h004018A4   cmp         ebp,esp004018A6   call        __chkesp (00401ff0)004018AB   mov         esp,ebp004018AD   pop         ebp004018AE   ret42:   };43:44:   class CAmerican : public CPerson45:   {46:   public:47:       CAmerican()00401990   push        ebp00401991   mov         ebp,esp00401993   sub         esp,44h00401996   push        ebx00401997   push        esi00401998   push        edi00401999   push        ecx0040199A   lea         edi,[ebp-44h]0040199D   mov         ecx,11h004019A2   mov         eax,0CCCCCCCCh004019A7   rep stos    dword ptr [edi]004019A9   pop         ecx004019AA   mov         dword ptr [ebp-4],ecx004019AD   mov         ecx,dword ptr [ebp-4]004019B0   call        @ILT+85(CPerson::CPerson) (0040105a)004019B5   mov         eax,dword ptr [ebp-4]004019B8   mov         dword ptr [eax],offset string "Speak American\n" (00425080)48:       {49:50:       }004019BE   mov         eax,dword ptr [ebp-4]004019C1   pop         edi004019C2   pop         esi004019C3   pop         ebx004019C4   add         esp,44h004019C7   cmp         ebp,esp004019C9   call        __chkesp (00401ff0)004019CE   mov         esp,ebp004019D0   pop         ebp004019D1   ret51:       virtual ~CAmerican()52:       {004019E0   push        ebp004019E1   mov         ebp,esp004019E3   sub         esp,44h004019E6   push        ebx004019E7   push        esi004019E8   push        edi004019E9   push        ecx004019EA   lea         edi,[ebp-44h]004019ED   mov         ecx,11h004019F2   mov         eax,0CCCCCCCCh004019F7   rep stos    dword ptr [edi]004019F9   pop         ecx004019FA   mov         dword ptr [ebp-4],ecx004019FD   mov         eax,dword ptr [ebp-4]00401A00   mov         dword ptr [eax],offset string "Speak American\n" (00425080)53:54:       }00401A06   mov         ecx,dword ptr [ebp-4]00401A09   call        @ILT+50(CPerson::~CPerson) (00401037)00401A0E   pop         edi00401A0F   pop         esi00401A10   pop         ebx00401A11   add         esp,44h00401A14   cmp         ebp,esp00401A16   call        __chkesp (00401ff0)00401A1B   mov         esp,ebp00401A1D   pop         ebp00401A1E   ret64:   };65:   class CGerman : public CPerson66:   {67:   public:68:       CGerman()0040F6E0   push        ebp0040F6E1   mov         ebp,esp0040F6E3   sub         esp,44h0040F6E6   push        ebx0040F6E7   push        esi0040F6E8   push        edi0040F6E9   push        ecx0040F6EA   lea         edi,[ebp-44h]0040F6ED   mov         ecx,11h0040F6F2   mov         eax,0CCCCCCCCh0040F6F7   rep stos    dword ptr [edi]0040F6F9   pop         ecx0040F6FA   mov         dword ptr [ebp-4],ecx0040F6FD   mov         ecx,dword ptr [ebp-4]0040F700   call        @ILT+85(CPerson::CPerson) (0040105a)0040F705   mov         eax,dword ptr [ebp-4]0040F708   mov         dword ptr [eax],offset string "Speak German\n" (004250a0)69:       {70:71:       }0040F70E   mov         eax,dword ptr [ebp-4]0040F711   pop         edi0040F712   pop         esi0040F713   pop         ebx0040F714   add         esp,44h0040F717   cmp         ebp,esp0040F719   call        __chkesp (00401ff0)0040F71E   mov         esp,ebp0040F720   pop         ebp0040F721   ret72:       virtual ~CGerman()73:       {00401B00   push        ebp00401B01   mov         ebp,esp00401B03   push        0FFh00401B05   push        offset __ehhandler$??1CGerman@@UAE@XZ (00413dc9)00401B0A   mov         eax,fs:[00000000]00401B10   push        eax00401B11   mov         dword ptr fs:[0],esp00401B18   sub         esp,44h00401B1B   push        ebx00401B1C   push        esi00401B1D   push        edi00401B1E   push        ecx00401B1F   lea         edi,[ebp-50h]00401B22   mov         ecx,11h00401B27   mov         eax,0CCCCCCCCh00401B2C   rep stos    dword ptr [edi]00401B2E   pop         ecx00401B2F   mov         dword ptr [ebp-10h],ecx00401B32   mov         eax,dword ptr [ebp-10h]00401B35   mov         dword ptr [eax],offset string "Speak German\n" (004250a0)00401B3B   mov         dword ptr [ebp-4],074:           ShowSpeak();00401B42   mov         ecx,dword ptr [ebp-10h]00401B45   call        @ILT+45(CPerson::ShowSpeak) (00401032)75:       }00401B4A   mov         dword ptr [ebp-4],0FFFFFFFFh00401B51   mov         ecx,dword ptr [ebp-10h]00401B54   call        @ILT+50(CPerson::~CPerson) (00401037)00401B59   mov         ecx,dword ptr [ebp-0Ch]00401B5C   mov         dword ptr fs:[0],ecx00401B63   pop         edi00401B64   pop         esi00401B65   pop         ebx00401B66   add         esp,50h00401B69   cmp         ebp,esp00401B6B   call        __chkesp (00401ff0)00401B70   mov         esp,ebp00401B72   pop         ebp00401B73   ret85:   };86:   void speak(CPerson *pPerson)87:   {00401500   push        ebp00401501   mov         ebp,esp00401503   sub         esp,40h00401506   push        ebx00401507   push        esi00401508   push        edi00401509   lea         edi,[ebp-40h]0040150C   mov         ecx,10h00401511   mov         eax,0CCCCCCCCh00401516   rep stos    dword ptr [edi]88:       pPerson->ShowSpeak();00401518   mov         eax,dword ptr [ebp+8]0040151B   mov         edx,dword ptr [eax]0040151D   mov         esi,esp0040151F   mov         ecx,dword ptr [ebp+8]00401522   call        dword ptr [edx+4]00401525   cmp         esi,esp00401527   call        __chkesp (00401ff0)89:   }0040152C   pop         edi0040152D   pop         esi0040152E   pop         ebx0040152F   add         esp,40h00401532   cmp         ebp,esp00401534   call        __chkesp (00401ff0)00401539   mov         esp,ebp0040153B   pop         ebp0040153C   ret90:   int main()91:   {00401550   push        ebp00401551   mov         ebp,esp00401553   push        0FFh00401555   push        offset __ehhandler$_main (00413dab)0040155A   mov         eax,fs:[00000000]00401560   push        eax00401561   mov         dword ptr fs:[0],esp00401568   sub         esp,50h0040156B   push        ebx0040156C   push        esi0040156D   push        edi0040156E   lea         edi,[ebp-5Ch]00401571   mov         ecx,14h00401576   mov         eax,0CCCCCCCCh0040157B   rep stos    dword ptr [edi]92:       CChinese Chinese;0040157D   lea         ecx,[ebp-10h]00401580   call        @ILT+40(CChinese::CChinese) (0040102d)00401585   mov         dword ptr [ebp-4],093:       CAmerican American;0040158C   lea         ecx,[ebp-14h]0040158F   call        @ILT+35(CAmerican::CAmerican) (00401028)00401594   mov         byte ptr [ebp-4],194:       CGerman German;00401598   lea         ecx,[ebp-18h]0040159B   call        @ILT+30(CGerman::CGerman) (00401023)004015A0   mov         byte ptr [ebp-4],295:       speak(&Chinese);004015A4   lea         eax,[ebp-10h]004015A7   push        eax004015A8   call        @ILT+145(speak) (00401096)004015AD   add         esp,496:       speak(&American);004015B0   lea         ecx,[ebp-14h]004015B3   push        ecx004015B4   call        @ILT+145(speak) (00401096)004015B9   add         esp,497:       speak(&German);004015BC   lea         edx,[ebp-18h]004015BF   push        edx004015C0   call        @ILT+145(speak) (00401096)004015C5   add         esp,498:       return 0;004015C8   mov         dword ptr [ebp-1Ch],0004015CF   mov         byte ptr [ebp-4],1004015D3   lea         ecx,[ebp-18h]004015D6   call        @ILT+70(CGerman::~CGerman) (0040104b)004015DB   mov         byte ptr [ebp-4],0004015DF   lea         ecx,[ebp-14h]004015E2   call        @ILT+95(CAmerican::~CAmerican) (00401064)004015E7   mov         dword ptr [ebp-4],0FFFFFFFFh004015EE   lea         ecx,[ebp-10h]004015F1   call        @ILT+105(CChinese::ShowSpeak) (0040106e)004015F6   mov         eax,dword ptr [ebp-1Ch]99:   }004015F9   mov         ecx,dword ptr [ebp-0Ch]004015FC   mov         dword ptr fs:[0],ecx00401603   pop         edi00401604   pop         esi00401605   pop         ebx00401606   add         esp,5Ch00401609   cmp         ebp,esp0040160B   call        __chkesp (00401ff0)00401610   mov         esp,ebp00401612   pop         ebp00401613   ret#include<stdio.h>class CPerson{public:CPerson(){ShowSpeak();}virtual ~CPerson(){ShowSpeak();}virtual void ShowSpeak(){printf("%s::ShowSpeak()\r\n" , GetClassName());}virtual char * GetClassName(){return "CPerson";}};class CChinese : public CPerson{public:CChinese(){ShowSpeak();}virtual ~CChinese(){ShowSpeak();}//virtual void ShowSpeak()//{//printf("Speak Chinese\n");//}virtual char * GetClassName(){return "CChinese";}};class CAmerican : public CPerson{public:CAmerican(){ShowSpeak();}virtual ~CAmerican(){ShowSpeak();}/*virtual void ShowSpeak(){printf("Speak American\n");}*/virtual char * GetClassName(){return "CAmerican";}};class CGerman : public CPerson{public:CGerman(){ShowSpeak();}virtual ~CGerman(){ShowSpeak();}/*virtual void ShowSpeak(){printf("Speak German\n");}*/virtual char * GetClassName(){return "CGerman";}};void speak(CPerson *pPerson){pPerson->ShowSpeak();}int main(){CChinese Chinese;CAmerican American;CGerman German;//speak(&Chinese);//speak(&American);//speak(&German);return 0;}CPerson::ShowSpeak()此处虚表是父类的CChinese::ShowSpeak()CPerson::ShowSpeak()CAmerican::ShowSpeak()CPerson::ShowSpeak()CGerman::ShowSpeak()CGerman::ShowSpeak()此处调用虚函数CPerson::ShowSpeak()CAmerican::ShowSpeak()CPerson::ShowSpeak()CChinese::ShowSpeak()CPerson::ShowSpeak()


0 0
原创粉丝点击