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
- cpp反汇编之共同继承一个父类
- cpp反汇编之继承之基类
- cpp反汇编之菱形继承
- cpp反汇编之多继承
- cpp反汇编之protected
- cpp反汇编之数组
- cpp反汇编之指针
- cpp反汇编分析之构造函数
- cpp反汇编之控制结构
- cpp反汇编之构造函数2
- cpp反汇编之const分析
- 反汇编分析之:继承,多重继承,多层继承,父子类指针本质
- 反汇编之路
- 反汇编之爆破
- 一个反汇编的例子
- 一个反汇编的例子
- 反汇编一个c程序
- C++反汇编学习笔记-多重继承
- 轻松学习Spring IoC容器和Dependency Injection模式
- 字符串同构最小最大表示法模板&&manacher模板
- JSP四种会话跟踪技术
- animate.css-非常cool的css3第三方库特效-贴上demo
- 【新浪微博项目】03微博项目MVC管理与IOS7优化
- cpp反汇编之共同继承一个父类
- 用bat文件备份sqlserver数据库,在通过spring的schedule执行runtime完成周期备份
- 使用镜像站同步android sdk
- win8系统安装mingw遇到的问题
- C#文件文件夹拖拽功能的实现
- Oracle 获取本周、本月、本季、本年的第一天和最后一天
- 字符串复制
- 面试总结-百度(2)
- 解决eclipse中出现Resource is out of sync with the file system问题