cpp反汇编之菱形继承

先分析一个例子

#include<stdio.h>
class CFurniture
{
public:
	CFurniture()
	{
		m_nPrice = 0;
	}
	virtual ~CFurniture()
	{
		printf("virtual ~CFurniture()\n");
	}
	virtual int GetPrice()
	{
		return m_nPrice;
	}
public:
	int m_nPrice;
};
class CSofa : virtual public CFurniture
{
public:
	CSofa()
	{
		m_nPrice = 1;
		m_nColor = 2;
	}
	virtual ~CSofa()
	{
		printf("virtual ~CSofa()\n");
	}
	virtual int GeyColor()
	{
		return m_nColor;
	}
	virtual int SitDown()
	{
		return printf("Sit down and rest your legs\n");
	}
public:
	int m_nColor;
};
class CBed : virtual public CFurniture
{
public:
	CBed()
	{
		m_nPrice = 3;
		m_nLength = 2;
		m_nWidth = 1;
	}
	~CBed()
	{
		printf("virtual ~CBed()\n");
	}
	virtual int GetArea()
	{
		return m_nLength * m_nWidth;
	}
	virtual int Sleep()
	{
		return printf("go to sleep!\n");
	}
public:
	int m_nLength;
	int m_nWidth;
};
class CSofaBed : public CSofa , public CBed
{
public:
	CSofaBed()
	{
		m_nHeight = 6;
	}
	virtual ~CSofaBed()
	{
		printf("virtual ~CSofaBed\n");
	}
	virtual int SitDown()
	{
		return printf("Sit Down on the sofa bed\n");
	}
	virtual int Sleep()
	{
		return printf("go to sleep on the sofa bed\n");
	}
	virtual int GetHeight()
	{
		return m_nHeight;
	}
	virtual void Show()
	{
		printf("CSofaBed Show()\n");
	}
public:
	int m_nHeight;
};

int main()
{
	CSofaBed SofaBed;
	CFurniture * pFurniture = &SofaBed;
	CSofa * pSofa = &SofaBed;
	CBed * pBed = &SofaBed;
	pFurniture->m_nPrice = 88;
	pSofa->m_nColor = 8;
	pSofa->m_nPrice = 90;
	pBed->m_nLength = 13;
	pBed->m_nWidth = 66;
	SofaBed.m_nHeight = 45;
	SofaBed.Show();
	return 0;
}

下面是反汇编分析包括内存截取

1:    #include<stdio.h>
2:    class CFurniture
3:    {
4:    public:
5:        CFurniture()
004021D0   push        ebp
004021D1   mov         ebp,esp
004021D3   sub         esp,44h
004021D6   push        ebx
004021D7   push        esi
004021D8   push        edi
004021D9   push        ecx
004021DA   lea         edi,[ebp-44h]
004021DD   mov         ecx,11h
004021E2   mov         eax,0CCCCCCCCh
004021E7   rep stos    dword ptr [edi]
004021E9   pop         ecx
004021EA   mov         dword ptr [ebp-4],ecx
004021ED   mov         eax,dword ptr [ebp-4]
004021F0   mov         dword ptr [eax],offset CFurniture::`vftable' (0042611c)
6:        {
7:            m_nPrice = 0;
004021F6   mov         ecx,dword ptr [ebp-4]
004021F9   mov         dword ptr [ecx+4],0
8:        }
00402200   mov         eax,dword ptr [ebp-4]
00402203   pop         edi
00402204   pop         esi
00402205   pop         ebx
00402206   mov         esp,ebp
00402208   pop         ebp
00402209   ret

9:        virtual ~CFurniture()
10:       {
00402220   push        ebp
00402221   mov         ebp,esp
00402223   sub         esp,44h
00402226   push        ebx
00402227   push        esi
00402228   push        edi
00402229   push        ecx
0040222A   lea         edi,[ebp-44h]
0040222D   mov         ecx,11h
00402232   mov         eax,0CCCCCCCCh
00402237   rep stos    dword ptr [edi]
00402239   pop         ecx
0040223A   mov         dword ptr [ebp-4],ecx
0040223D   mov         eax,dword ptr [ebp-4]
00402240   mov         dword ptr [eax],offset CFurniture::`vftable' (0042611c)
11:           printf("virtual ~CFurniture()\n");
00402246   push        offset string "virtual ~CFurniture()\n" (00426128)
0040224B   call        printf (00403020)
00402250   add         esp,4
12:       }
00402253   pop         edi
00402254   pop         esi
00402255   pop         ebx
00402256   add         esp,44h
00402259   cmp         ebp,esp
0040225B   call        __chkesp (00402ef0)
00402260   mov         esp,ebp
00402262   pop         ebp
00402263   ret

13:       virtual int GetPrice()
14:       {
00402280   push        ebp
00402281   mov         ebp,esp
00402283   sub         esp,44h
00402286   push        ebx
00402287   push        esi
00402288   push        edi
00402289   push        ecx
0040228A   lea         edi,[ebp-44h]
0040228D   mov         ecx,11h
00402292   mov         eax,0CCCCCCCCh
00402297   rep stos    dword ptr [edi]
00402299   pop         ecx
0040229A   mov         dword ptr [ebp-4],ecx
15:           return m_nPrice;
0040229D   mov         eax,dword ptr [ebp-4]
004022A0   mov         eax,dword ptr [eax+4]
16:       }
004022A3   pop         edi
004022A4   pop         esi
004022A5   pop         ebx
004022A6   mov         esp,ebp
004022A8   pop         ebp
004022A9   ret

17:   protected:
18:       int m_nPrice;
19:   };
20:   class CSofa : virtual public CFurniture
21:   {
22:   public:
23:       CSofa()
00402330   push        ebp
00402331   mov         ebp,esp
00402333   sub         esp,48h
00402336   push        ebx
00402337   push        esi
00402338   push        edi
00402339   push        ecx
0040233A   lea         edi,[ebp-48h]
0040233D   mov         ecx,12h
00402342   mov         eax,0CCCCCCCCh
00402347   rep stos    dword ptr [edi]
00402349   pop         ecx
0040234A   mov         dword ptr [ebp-4],ecx
0040234D   mov         dword ptr [ebp-8],0
00402354   cmp         dword ptr [ebp+8],0
00402358   je          CSofa::CSofa+48h (00402378)
0040235A   mov         eax,dword ptr [ebp-4]
0040235D   mov         dword ptr [eax+4],offset CSofa::`vbtable' (0042615c)
00402364   mov         ecx,dword ptr [ebp-4]
00402367   add         ecx,0Ch
0040236A   call        @ILT+120(CFurniture::CFurniture) (0040107d)	跳过调用父类构造函数
0040236F   mov         ecx,dword ptr [ebp-8]
00402372   or          ecx,1
00402375   mov         dword ptr [ebp-8],ecx
00402378   mov         edx,dword ptr [ebp-4]
0040237B   mov         dword ptr [edx],offset CSofa::`vftable' (00426150)
00402381   mov         eax,dword ptr [ebp-4]
00402384   mov         ecx,dword ptr [eax+4]
00402387   mov         edx,dword ptr [ecx+4]
0040238A   mov         eax,dword ptr [ebp-4]
0040238D   mov         dword ptr [eax+edx+4],offset CSofa::`vftable' (00426144)
24:       {
25:           m_nPrice = 1;
00402395   mov         ecx,dword ptr [ebp-4]
00402398   mov         edx,dword ptr [ecx+4]
0040239B   mov         eax,dword ptr [edx+4]
0040239E   mov         ecx,dword ptr [ebp-4]
004023A1   mov         dword ptr [ecx+eax+8],1
26:           m_nColor = 2;
004023A9   mov         edx,dword ptr [ebp-4]
004023AC   mov         dword ptr [edx+8],2
27:       }
004023B3   mov         eax,dword ptr [ebp-4]
004023B6   pop         edi
004023B7   pop         esi
004023B8   pop         ebx
004023B9   add         esp,48h
004023BC   cmp         ebp,esp
004023BE   call        __chkesp (00402ef0)
004023C3   mov         esp,ebp
004023C5   pop         ebp
004023C6   ret         4

28:       virtual ~CSofa()
29:       {
004023F0   push        ebp
004023F1   mov         ebp,esp
004023F3   sub         esp,44h
004023F6   push        ebx
004023F7   push        esi
004023F8   push        edi
004023F9   push        ecx
004023FA   lea         edi,[ebp-44h]
004023FD   mov         ecx,11h
00402402   mov         eax,0CCCCCCCCh
00402407   rep stos    dword ptr [edi]
00402409   pop         ecx
0040240A   mov         dword ptr [ebp-4],ecx
0040240D   mov         eax,dword ptr [ebp-4]
00402410   mov         dword ptr [eax-0Ch],offset CSofa::`vftable' (00426150)
00402417   mov         ecx,dword ptr [ebp-4]
0040241A   mov         edx,dword ptr [ecx-8]
0040241D   mov         eax,dword ptr [edx+4]
00402420   mov         ecx,dword ptr [ebp-4]
00402423   mov         dword ptr [ecx+eax-8],offset CSofa::`vftable' (00426144)
30:           printf("virtual ~CSofa()\n");
0040242B   push        offset string "virtual ~CSofa()\n" (00426168)
00402430   call        printf (00403020)
00402435   add         esp,4
31:       }
00402438   pop         edi
00402439   pop         esi
0040243A   pop         ebx
0040243B   add         esp,44h
0040243E   cmp         ebp,esp
00402440   call        __chkesp (00402ef0)
00402445   mov         esp,ebp
00402447   pop         ebp
00402448   ret

32:       virtual int GeyColor()
33:       {
00402460   push        ebp
00402461   mov         ebp,esp
00402463   sub         esp,44h
00402466   push        ebx
00402467   push        esi
00402468   push        edi
00402469   push        ecx
0040246A   lea         edi,[ebp-44h]
0040246D   mov         ecx,11h
00402472   mov         eax,0CCCCCCCCh
00402477   rep stos    dword ptr [edi]
00402479   pop         ecx
0040247A   mov         dword ptr [ebp-4],ecx
34:           return m_nColor;
0040247D   mov         eax,dword ptr [ebp-4]
00402480   mov         eax,dword ptr [eax+8]
35:       }
00402483   pop         edi
00402484   pop         esi
00402485   pop         ebx
00402486   mov         esp,ebp
00402488   pop         ebp
00402489   ret

36:       virtual int SitDown()
37:       {
004024A0   push        ebp
004024A1   mov         ebp,esp
004024A3   sub         esp,44h
004024A6   push        ebx
004024A7   push        esi
004024A8   push        edi
004024A9   push        ecx
004024AA   lea         edi,[ebp-44h]
004024AD   mov         ecx,11h
004024B2   mov         eax,0CCCCCCCCh
004024B7   rep stos    dword ptr [edi]
004024B9   pop         ecx
004024BA   mov         dword ptr [ebp-4],ecx
38:           return printf("Sit down and rest your legs\n");
004024BD   push        offset string "Sit down and rest your legs\n" (00426180)
004024C2   call        printf (00403020)
004024C7   add         esp,4
39:       }
004024CA   pop         edi
004024CB   pop         esi
004024CC   pop         ebx
004024CD   add         esp,44h
004024D0   cmp         ebp,esp
004024D2   call        __chkesp (00402ef0)
004024D7   mov         esp,ebp
004024D9   pop         ebp
004024DA   ret

40:   protected:
41:       int m_nColor;
42:   };
43:   class CBed : virtual public CFurniture
44:   {
45:   public:
46:       CBed()
004025C0   push        ebp
004025C1   mov         ebp,esp
004025C3   sub         esp,48h
004025C6   push        ebx
004025C7   push        esi
004025C8   push        edi
004025C9   push        ecx
004025CA   lea         edi,[ebp-48h]
004025CD   mov         ecx,12h
004025D2   mov         eax,0CCCCCCCCh
004025D7   rep stos    dword ptr [edi]
004025D9   pop         ecx
004025DA   mov         dword ptr [ebp-4],ecx
004025DD   mov         dword ptr [ebp-8],0
004025E4   cmp         dword ptr [ebp+8],0
004025E8   je          CBed::CBed+48h (00402608)
004025EA   mov         eax,dword ptr [ebp-4]
004025ED   mov         dword ptr [eax+4],offset CBed::`vbtable' (004261bc)
004025F4   mov         ecx,dword ptr [ebp-4]
004025F7   add         ecx,10h
004025FA   call        @ILT+120(CFurniture::CFurniture) (0040107d)
004025FF   mov         ecx,dword ptr [ebp-8]
00402602   or          ecx,1
00402605   mov         dword ptr [ebp-8],ecx
00402608   mov         edx,dword ptr [ebp-4]
0040260B   mov         dword ptr [edx],offset CBed::`vftable' (004261b0)
00402611   mov         eax,dword ptr [ebp-4]
00402614   mov         ecx,dword ptr [eax+4]
00402617   mov         edx,dword ptr [ecx+4]
0040261A   mov         eax,dword ptr [ebp-4]
0040261D   mov         dword ptr [eax+edx+4],offset CBed::`vftable' (004261a4)
47:       {
48:           m_nPrice = 3;
00402625   mov         ecx,dword ptr [ebp-4]
00402628   mov         edx,dword ptr [ecx+4]
0040262B   mov         eax,dword ptr [edx+4]
0040262E   mov         ecx,dword ptr [ebp-4]
00402631   mov         dword ptr [ecx+eax+8],3
49:           m_nLength = 2;
00402639   mov         edx,dword ptr [ebp-4]
0040263C   mov         dword ptr [edx+8],2
50:           m_nWidth = 1;
00402643   mov         eax,dword ptr [ebp-4]
00402646   mov         dword ptr [eax+0Ch],1
51:       }
0040264D   mov         eax,dword ptr [ebp-4]
00402650   pop         edi
00402651   pop         esi
00402652   pop         ebx
00402653   add         esp,48h
00402656   cmp         ebp,esp
00402658   call        __chkesp (00402ef0)
0040265D   mov         esp,ebp
0040265F   pop         ebp
00402660   ret         4

52:       ~CBed()
53:       {
004027F0   push        ebp
004027F1   mov         ebp,esp
004027F3   sub         esp,44h
004027F6   push        ebx
004027F7   push        esi
004027F8   push        edi
004027F9   push        ecx
004027FA   lea         edi,[ebp-44h]
004027FD   mov         ecx,11h
00402802   mov         eax,0CCCCCCCCh
00402807   rep stos    dword ptr [edi]
00402809   pop         ecx
0040280A   mov         dword ptr [ebp-4],ecx
0040280D   mov         eax,dword ptr [ebp-4]
00402810   mov         dword ptr [eax-10h],offset CBed::`vftable' (004261b0)
00402817   mov         ecx,dword ptr [ebp-4]
0040281A   mov         edx,dword ptr [ecx-0Ch]
0040281D   mov         eax,dword ptr [edx+4]
00402820   mov         ecx,dword ptr [ebp-4]
00402823   mov         dword ptr [ecx+eax-0Ch],offset CBed::`vftable' (004261a4)
54:           printf("virtual ~CBed()\n");
0040282B   push        offset string "virtual ~CBed()\n" (004261d8)
00402830   call        printf (00403020)
00402835   add         esp,4
55:       }
00402838   pop         edi
00402839   pop         esi
0040283A   pop         ebx
0040283B   add         esp,44h
0040283E   cmp         ebp,esp
00402840   call        __chkesp (00402ef0)
00402845   mov         esp,ebp
00402847   pop         ebp
00402848   ret

64:   protected:
65:       int m_nLength;
66:       int m_nWidth;
67:   };
68:   class CSofaBed : public CSofa , public CBed
69:   {
70:   public:
71:       CSofaBed()
004020B0   push        ebp
004020B1   mov         ebp,esp
004020B3   push        0FFh
004020B5   push        offset [email protected]@[email protected] (00414d86)
004020BA   mov         eax,fs:[00000000]
004020C0   push        eax
004020C1   mov         dword ptr fs:[0],esp
004020C8   sub         esp,48h
004020CB   push        ebx
004020CC   push        esi
004020CD   push        edi
004020CE   push        ecx
004020CF   lea         edi,[ebp-54h]
004020D2   mov         ecx,12h
004020D7   mov         eax,0CCCCCCCCh
004020DC   rep stos    dword ptr [edi]
004020DE   pop         ecx
004020DF   mov         dword ptr [ebp-10h],ecx
004020E2   mov         dword ptr [ebp-14h],0
004020E9   cmp         dword ptr [ebp+8],0
004020ED   je          CSofaBed::CSofaBed+6Eh (0040211e)
004020EF   mov         eax,dword ptr [ebp-10h]
004020F2   mov         dword ptr [eax+4],offset CSofaBed::`vbtable' (00426110)
004020F9   mov         ecx,dword ptr [ebp-10h]
004020FC   mov         dword ptr [ecx+10h],offset CSofaBed::`vbtable' (00426104)
00402103   mov         ecx,dword ptr [ebp-10h]
00402106   add         ecx,20h
00402109   call        @ILT+120(CFurniture::CFurniture) (0040107d)
0040210E   mov         edx,dword ptr [ebp-14h]
00402111   or          edx,1
00402114   mov         dword ptr [ebp-14h],edx
00402117   mov         dword ptr [ebp-4],0
0040211E   push        0
00402120   mov         ecx,dword ptr [ebp-10h]
00402123   call        @ILT+245(CSofa::CSofa) (004010fa)
00402128   mov         dword ptr [ebp-4],1
0040212F   push        0
00402131   mov         ecx,dword ptr [ebp-10h]
00402134   add         ecx,0Ch
00402137   call        @ILT+285(CBed::CBed) (00401122)
0040213C   mov         eax,dword ptr [ebp-10h]
0040213F   mov         dword ptr [eax],offset CSofaBed::`vftable' (004260f4)
00402145   mov         ecx,dword ptr [ebp-10h]
00402148   mov         dword ptr [ecx+0Ch],offset CSofaBed::`vftable' (004260e8)
0040214F   mov         edx,dword ptr [ebp-10h]
00402152   mov         eax,dword ptr [edx+4]
00402155   mov         ecx,dword ptr [eax+4]
00402158   mov         edx,dword ptr [ebp-10h]
0040215B   mov         dword ptr [edx+ecx+4],offset CSofaBed::`vftable' (004260dc)
72:       {
73:           m_nHeight = 6;
00402163   mov         eax,dword ptr [ebp-10h]
00402166   mov         dword ptr [eax+1Ch],6
74:       }
0040216D   mov         dword ptr [ebp-4],0FFFFFFFFh
00402174   mov         eax,dword ptr [ebp-10h]
00402177   mov         ecx,dword ptr [ebp-0Ch]
0040217A   mov         dword ptr fs:[0],ecx
00402181   pop         edi
00402182   pop         esi
00402183   pop         ebx
00402184   add         esp,54h
00402187   cmp         ebp,esp
00402189   call        __chkesp (00402ef0)
0040218E   mov         esp,ebp
00402190   pop         ebp
00402191   ret         4

75:       virtual ~CSofaBed()
76:       {
00402A10   push        ebp
00402A11   mov         ebp,esp
00402A13   push        0FFh
00402A15   push        offset [email protected]@[email protected] (00414dac)
00402A1A   mov         eax,fs:[00000000]
00402A20   push        eax
00402A21   mov         dword ptr fs:[0],esp
00402A28   sub         esp,48h
00402A2B   push        ebx
00402A2C   push        esi
00402A2D   push        edi
00402A2E   push        ecx
00402A2F   lea         edi,[ebp-54h]
00402A32   mov         ecx,12h
00402A37   mov         eax,0CCCCCCCCh
00402A3C   rep stos    dword ptr [edi]
00402A3E   pop         ecx
00402A3F   mov         dword ptr [ebp-10h],ecx
00402A42   mov         eax,dword ptr [ebp-10h]
00402A45   mov         dword ptr [eax-20h],offset CSofaBed::`vftable' (004260f4)
00402A4C   mov         ecx,dword ptr [ebp-10h]
00402A4F   mov         dword ptr [ecx-14h],offset CSofaBed::`vftable' (004260e8)
00402A56   mov         edx,dword ptr [ebp-10h]
00402A59   mov         eax,dword ptr [edx-1Ch]
00402A5C   mov         ecx,dword ptr [eax+4]
00402A5F   mov         edx,dword ptr [ebp-10h]
00402A62   mov         dword ptr [edx+ecx-1Ch],offset CSofaBed::`vftable' (004260dc)
00402A6A   mov         dword ptr [ebp-4],0
77:           printf("virtual ~CSofaBed\n");
00402A71   push        offset string "virtual ~CSofaBed\n" (00426230)
00402A76   call        printf (00403020)
00402A7B   add         esp,4
78:       }
00402A7E   mov         eax,dword ptr [ebp-10h]
00402A81   sub         eax,20h
00402A84   test        eax,eax
00402A86   je          CSofaBed::~CSofaBed+83h (00402a93)
00402A88   mov         ecx,dword ptr [ebp-10h]
00402A8B   sub         ecx,14h
00402A8E   mov         dword ptr [ebp-14h],ecx
00402A91   jmp         CSofaBed::~CSofaBed+8Ah (00402a9a)
00402A93   mov         dword ptr [ebp-14h],0
00402A9A   mov         ecx,dword ptr [ebp-14h]
00402A9D   add         ecx,10h
00402AA0   call        @ILT+205(CBed::~CBed) (004010d2)
00402AA5   mov         dword ptr [ebp-4],0FFFFFFFFh
00402AAC   mov         ecx,dword ptr [ebp-10h]
00402AAF   sub         ecx,14h
00402AB2   call        @ILT+280(CSofa::~CSofa) (0040111d)
00402AB7   mov         ecx,dword ptr [ebp-0Ch]
00402ABA   mov         dword ptr fs:[0],ecx
00402AC1   pop         edi
00402AC2   pop         esi
00402AC3   pop         ebx
00402AC4   add         esp,54h
00402AC7   cmp         ebp,esp
00402AC9   call        __chkesp (00402ef0)
00402ACE   mov         esp,ebp
00402AD0   pop         ebp
00402AD1   ret

79:       virtual int SitDown()
80:       {
00402860   push        ebp
00402861   mov         ebp,esp
00402863   sub         esp,44h
00402866   push        ebx
00402867   push        esi
00402868   push        edi
00402869   push        ecx
0040286A   lea         edi,[ebp-44h]
0040286D   mov         ecx,11h
00402872   mov         eax,0CCCCCCCCh
00402877   rep stos    dword ptr [edi]
00402879   pop         ecx
0040287A   mov         dword ptr [ebp-4],ecx
81:           return printf("Sit Down on the sofa bed\n");
0040287D   push        offset string "Sit Down on the sofa bed\n" (004261ec)
00402882   call        printf (00403020)
00402887   add         esp,4
82:       }
0040288A   pop         edi
0040288B   pop         esi
0040288C   pop         ebx
0040288D   add         esp,44h
00402890   cmp         ebp,esp
00402892   call        __chkesp (00402ef0)
00402897   mov         esp,ebp
00402899   pop         ebp
0040289A   ret

83:       virtual int Sleep()
84:       {
004028B0   push        ebp
004028B1   mov         ebp,esp
004028B3   sub         esp,44h
004028B6   push        ebx
004028B7   push        esi
004028B8   push        edi
004028B9   push        ecx
004028BA   lea         edi,[ebp-44h]
004028BD   mov         ecx,11h
004028C2   mov         eax,0CCCCCCCCh
004028C7   rep stos    dword ptr [edi]
004028C9   pop         ecx
004028CA   mov         dword ptr [ebp-4],ecx
85:           return printf("go to sleep on the sofa bed\n");
004028CD   push        offset string "go to sleep on the sofa bed\n" (0042620c)
004028D2   call        printf (00403020)
004028D7   add         esp,4
86:       }
004028DA   pop         edi
004028DB   pop         esi
004028DC   pop         ebx
004028DD   add         esp,44h
004028E0   cmp         ebp,esp
004028E2   call        __chkesp (00402ef0)
004028E7   mov         esp,ebp
004028E9   pop         ebp
004028EA   ret

87:       virtual int GetHeight()
88:       {
00402900   push        ebp
00402901   mov         ebp,esp
00402903   sub         esp,44h
00402906   push        ebx
00402907   push        esi
00402908   push        edi
00402909   push        ecx
0040290A   lea         edi,[ebp-44h]
0040290D   mov         ecx,11h
00402912   mov         eax,0CCCCCCCCh
00402917   rep stos    dword ptr [edi]
00402919   pop         ecx
0040291A   mov         dword ptr [ebp-4],ecx
89:           return m_nHeight;
0040291D   mov         eax,dword ptr [ebp-4]
00402920   mov         eax,dword ptr [eax+1Ch]
90:       }
00402923   pop         edi
00402924   pop         esi
00402925   pop         ebx
00402926   mov         esp,ebp
00402928   pop         ebp
00402929   ret

91:   protected:
92:       int m_nHeight;
93:   };
94:
95:   int main()
96:   {
004105F0   push        ebp
004105F1   mov         ebp,esp
004105F3   sub         esp,80h
004105F9   push        ebx
004105FA   push        esi
004105FB   push        edi
004105FC   lea         edi,[ebp-80h]
004105FF   mov         ecx,20h
00410604   mov         eax,0CCCCCCCCh
00410609   rep stos    dword ptr [edi]
97:       CSofaBed SofaBed;
0041060B   push        1		构造标志,构造祖父类
0041060D   lea         ecx,[ebp-28h]
00410610   call        @ILT+25(CSofaBed::CSofaBed) (0040101e)
98:       CFurniture * pFurniture = &SofaBed;
00410615   lea         eax,[ebp-28h]		 EAX = 0018FF20
00410618   test        eax,eax
0041061A   jne         main+35h (00410625)
0041061C   mov         dword ptr [ebp-3Ch],0
00410623   jmp         main+42h (00410632)
00410625   mov         ecx,dword ptr [ebp-24h]	 ECX = 00426110
00410628   mov         edx,dword ptr [ecx+4]	[ecx+4] = 2
0041062B   lea         eax,[ebp+edx-24h]
0041062F   mov         dword ptr [ebp-3Ch],eax
00410632   mov         ecx,dword ptr [ebp-3Ch]
00410635   mov         dword ptr [ebp-2Ch],ecx
99:       CSofa * pSofa = &SofaBed;
00410638   lea         edx,[ebp-28h]
0041063B   mov         dword ptr [ebp-30h],edx
100:      CBed * pBed = &SofaBed;
0041063E   lea         eax,[ebp-28h]
00410641   test        eax,eax
00410643   je          main+5Dh (0041064d)
00410645   lea         ecx,[ebp-1Ch]			ECX = 0018FF2C
00410648   mov         dword ptr [ebp-40h],ecx
0041064B   jmp         main+64h (00410654)
0041064D   mov         dword ptr [ebp-40h],0
00410654   mov         edx,dword ptr [ebp-40h]		EDX = 0018FF2C
00410657   mov         dword ptr [ebp-34h],edx		E8 60 42 00
101:      return 0;
0041065A   mov         dword ptr [ebp-38h],0
00410661   lea         ecx,[ebp-28h]
00410664   call        @ILT+40(CSofaBed::`vbase destructor') (0040102d)
00410669   mov         eax,dword ptr [ebp-38h]
102:  }
0041066C   pop         edi
0041066D   pop         esi
0041066E   pop         ebx
0041066F   add         esp,80h
00410675   cmp         ebp,esp
00410677   call        __chkesp (00402ef0)
0041067C   mov         esp,ebp
0041067E   pop         ebp
0041067F   ret

CSof<pre name="code" class="plain">下面是内存结构分析  对应一条或几条汇编代码

 EAX = 0018FF20
0018FF20  F4 60 42 00 10 61 42 00 02 00 00  鬬B..aB....
0018FF2B  00 E8 60 42 00 04 61 42 00 02 00  .鑐B..aB...
0018FF36  00 00 01 00 00 00 06 00 00 00 DC  ...........
00410625   mov         ecx,dword ptr [ebp-24h]
 ECX = 00426110
00426105  FF FF FF 10 00 00 00 00 00 00 00  ...........
00426110  FC FF FF FF 1C 00 00 00 00 00 00  ...........
0042611B  00 EB 10 40 00 F0 10 40 00 00 00  [email protected]@...
00426126  00 00 76 69 72 74 75 61 6C 20 7E  ..virtual ~
00426131  43 46 75 72 6E 69 74 75 72 65 28  CFurniture(
0042613C  29 0A 00 00 00 00 00 00 9B 10 40  )[email protected]
00426147  00 F0 10 40 00 00 00 00 00 8C 10  [email protected]
00426152  40 00 41 10 40 00 00 00 00 00 FC  @[email protected]
0042615D  FF FF FF 08 00 00 00 00 00 00 00  ...........
00426168  76 69 72 74 75 61 6C 20 7E 43 53  virtual ~CS
00426173  6F 66 61 28 29 0A 00 00 00 00 00  ofa()......
0042617E  00 00 53 69 74 20 64 6F 77 6E 20  ..Sit down
00426189  61 6E 64 20 72 65 73 74 20 79 6F  and rest yo
00426194  75 72 20 6C 65 67 73 0A 00 00 00  ur legs....
0042619F  00 00 00 00 00 0E 11 40 00 F0 10  [email protected]
004261AA  40 00 00 00 00 00 CD 10 40 00 D7  @[email protected]
004261B5  10 40 00 00 00 00 00 FC FF FF FF  [email protected]
004261C0  0C 00 00 00 00 00 00 00 67 6F 20  ........go
004261CB  74 6F 20 73 6C 65 65 70 21 0A 00  to sleep!..
004261D6  00 00 76 69 72 74 75 61 6C 20 7E  ..virtual ~
004261E1  43 42 65 64 28 29 0A 00 00 00 00  CBed().....
004261EC  53 69 74 20 44 6F 77 6E 20 6F 6E  Sit Down on
004261F7  20 74 68 65 20 73 6F 66 61 20 62   the sofa b
00426202  65 64 0A 00 00 00 00 00 00 00 67  ed........g
0042620D  6F 20 74 6F 20 73 6C 65 65 70 20  o to sleep
00426218  6F 6E 20 74 68 65 20 73 6F 66 61  on the sofa
00426223  20 62 65 64 0A 00 00 00 00 00 00   bed.......
0042622E  00 00 76 69 72 74 75 61 6C 20 7E  ..virtual ~
00426239  43 53 6F 66 61 42 65 64 0A 00 00  CSofaBed...
00426244  00 00 00 00 69 33 38 36 5C 63 68  ....i386\ch
0042624F  6B 65 73 70 2E 63 00 00 00 00 00  kesp.c.....
0042625A  00 00 54 68 65 20 76 61 6C 75 65  ..The value
00426265  20 6F 66 20 45 53 50 20 77 61 73   of ESP was
00426270  20 6E 6F 74 20 70 72 6F 70 65 72   not proper
0042627B  6C 79 20 73 61 76 65 64 20 61 63  ly saved ac
00426286  72 6F 73 73 20 61 20 66 75 6E 63  ross a func
00426291  74 69 6F 6E 20 63 61 6C 6C 2E 20  tion call.
0042629C  20 54 68 69 73 20 69 73 20 75 73   This is us
004262A7  75 61 6C 6C 79 20 61 20 72 65 73  ually a res
004262B2  75 6C 74 20 6F 66 20 63 61 6C 6C  ult of call
004262BD  69 6E 67 20 61 20 66 75 6E 63 74  ing a funct
004262C8  69 6F 6E 20 64 65 63 6C 61 72 65  ion declare
004262D3  64 20 77 69 74 68 20 6F 6E 65 20  d with one
004262DE  63 61 6C 6C 69 6E 67 20 63 6F 6E  calling con
004262E9  76 65 6E 74 69 6F 6E 20 77 69 74  vention wit
004262F4  68 20 61 20 66 75 6E 63 74 69 6F  h a functio
004262FF  6E 20 70 6F 69 6E 74 65 72 20 64  n pointer d
0042630A  65 63 6C 61 72 65 64 20 77 69 74  eclared wit
00426315  68 20 61 20 64 69 66 66 65 72 65  h a differe
00426320  6E 74 20 63 61 6C 6C 69 6E 67 20  nt calling
0042632B  63 6F 6E 76 65 6E 74 69 6F 6E 2E  convention.
00426336  20 00 70 72 69 6E 74 66 2E 63 00   .printf.c.
00426341  00 00 00 66 6F 72 6D 61 74 20 21  ...format !
0042634C  3D 20 4E 55 4C 4C 00 00 64 62 67  = NULL..dbg
00426357  64 65 6C 2E 63 70 70 00 00 5F 42  del.cpp.._B
00426362  4C 4F 43 4B 5F 54 59 50 45 5F 49  LOCK_TYPE_I
0042636D  53 5F 56 41 4C 49 44 28 70 48 65  S_VALID(pHe
00426378  61 64 2D 3E 6E 42 6C 6F 63 6B 55  ad->nBlockU
00426383  73 65 29 00 00 FF FF FF FF 38 32  se)......82
0042638E  40 00 53 32 40 00 00 00 00 00 FF  @[email protected]
00426399  FF FF FF D9 38 40 00 E6 38 40 00  [email protected]@.
004263A4  00 00 00 00 FF FF FF FF 00 00 00  ...........
004263AF  00 03 3B 40 00 00 00 00 00 C4 3A  ..;@......:
004263BA  40 00 D1 3A 40 00 FF FF FF FF 2C  @..:@.....,
004263C5  3E 40 00 32 3E 40 00 00 00 00 00  >@.2>@.....
004263D0  FF FF FF FF AE 3E 40 00 BD 3E 40  .....>@..>@

0018FF1C  CC CC CC CC F4 60 42 00 10 61 42  烫烫鬬B..aB		ebp-24h  00426110
0018FF27  00 02 00 00 00 E8 60 42 00 04 61  .....鑐B..a
0018FF32  42 00 02 00 00 00 01 00 00 00 06  B..........
0018FF3D  00 00 00 DC 60 42 00 03 00 00 00  ...躟B.....
0018FF48  88 FF 18 00 29 32 40 00 01 00 00  ....)[email protected]
0018FF53  00 A8 19 52 00 20 1A 52 00 00 00  ...R. .R...
0018FF5E  00 00 00 00 00 00 00 E0 FD 7E 00  .......帻~.
0018FF69  00 00 00 00 00 00 00 5C FF 18 00  .......\...
0018FF74  00 00 00 00 C4 FF 18 00 70 8E 40  ........p嶡
0018FF7F  00 88 63 42 00 00 00 00 00 94 FF  .坈B.......
0018FF8A  18 00 CA 33 3E 75 00 E0 FD 7E D4  ...3>u.帻~.
0018FF95  FF 18 00 D2 9E 4E 77 00 E0 FD 7E  ...覟Nw.帻~
0018FFA0  0E 75 4A 77 00 00 00 00 00 00 00  .uJw.......
0018FFAB  00 00 E0 FD 7E 00 00 00 00 00 00  ..帻~......
0018FFB6  00 00 00 00 00 00 A0 FF 18 00 00  ...........
0018FFC1  00 00 00 FF FF FF FF CD 1E 52 77  .........Rw
0018FFCC  FA 4F 1F 00 00 00 00 00 EC FF 18  鶲.........
0018FFD7  00 A5 9E 4E 77 40 31 40 00 00 E0  .[email protected]@...
0018FFE2  FD 7E 00 00 00 00 00 00 00 00 00  齸.........
0018FFED  00 00 00 00 00 00 00 40 31 40 00  [email protected]@.
0018FFF8  00 E0 FD 7E 00 00 00 00 41 63 74  .帻~....Act
00190003  78 20 00 00 00 01 00 00 00 0C 33  x ........3
0019000E  00 00 DC 00 00 00 00 00 00 00 20  .......... 

00426109  00 00 00 00 00 00 00 FC FF FF FF  ...........
00426114  1C 00 00 00 00 00 00 00 EB 10 40  [email protected]
0042611F  00 F0 10 40 00 00 00 00 00 76 69  [email protected]

00410625   mov         ecx,dword ptr [ebp-24h]
00410628   mov         edx,dword ptr [ecx+4]		edx = 1ch  [ecx+4]是取其中内容

0018FF24  10 61 42 00 02 00 00 00 E8 60 42  .aB.....鑐B
0018FF2F  00 04 61 42 00 02 00 00 00 01 00  ..aB.......
0018FF3A  00 00 06 00 00 00 DC 60 42 00 03  ......躟B..		祖父类首地址004260dc
0018FF45  00 00 00 88 FF 18 00 29 32 40 00  .......)[email protected]
0018FF50  01 00 00 00 A8 19 52 00 20 1A 52  ......R. .R
0041062B   lea         eax,[ebp+edx-24h]	 EAX = 0018FF40		是取[ebp+edx-24h]内容所在地址,即是	

[email protected]@[email protected]@@:
004260DC   xor         dl,byte ptr [eax]
004260DE   inc         eax
004260DF   add         al,dh
004260E1   adc         byte ptr [eax],al
004260E4   add         byte ptr [eax],al
004260E6   add         byte ptr [eax],al
						ebp+edx-24h的值
[email protected]@[email protected]@@:
004260E8   int         10h		CBed虚函数表地址
004260EA   inc         eax
004260EB   add         byte ptr [eax+10h],bh
004260EE   inc         eax
004260EF   add         byte ptr [eax],al
004260F1   add         byte ptr [eax],al
004260F3   add         byte ptr [eax+edx+10050040h],cl
004260FA   inc         eax
004260FB   add         ah,bl
004260FD   adc         byte ptr [eax],al
00426100   add         byte ptr [eax],al
00426102   add         byte ptr [eax],al

[email protected]@[email protected]@@:	Sofa父类
00426110   cld
00426111   ???
00426112   ???
00426113   call        fword ptr [eax+eax]
00426116   add         byte ptr [eax],al
00426118   add         byte ptr [eax],al
0042611A   add         byte ptr [eax],al

[email protected]@[email protected]@@:
00426104   cld
00426105   ???
00426106   ???
00426107   call        dword ptr [eax]
00426109   add         byte ptr [eax],al
0042610B   add         byte ptr [eax],al
0042610D   add         byte ptr [eax],al
0042610F   add         ah,bh
00426111   ???
00426112   ???
00426113   call        fword ptr [eax+eax]
00426116   add         byte ptr [eax],al
00426118   add         byte ptr [eax],al
0042611A   add         byte ptr [eax],al

0018FF03  CC CC CC CC CC CC CC CC CC 40 FF  烫烫烫烫藹.
0018FF0E  18 00 CC CC CC CC CC CC CC CC CC  ..烫烫烫烫.
0018FF19  CC CC CC CC CC CC CC F4 60 42 00  烫烫烫挑`B.
0018FF24  10 61 42 00 02 00 00 00 E8 60 42  .aB.....鑐B
0018FF2F  00 04 61 42 00 02 00 00 00 01 00  ..aB.......

00410635   mov         dword ptr [ebp-2Ch],ecx

0018FF19  CC CC CC 40 FF 18 00 F4 60 42 00  烫藹...鬬B.
0018FF24  10 61 42 00 02 00 00 00 E8 60 42  .aB.....鑐B

[email protected]@[email protected]@@:		CSofa虚函数基地址
004260F4   mov         word ptr [eax],ss
004260F6   inc         eax
004260F7   add         byte ptr ds:[0DC004010h],al
004260FD   adc         byte ptr [eax],al
00426100   add         byte ptr [eax],al
00426102   add         byte ptr [eax],al

0041063B   mov         dword ptr [ebp-30h],edx
100:      CBed * pBed = &SofaBed;
0041063E   lea         eax,[ebp-28h]
0018FF0E  18 00 CC CC CC CC CC CC CC CC 20  ..烫烫烫烫
0018FF19  FF 18 00 40 FF 18 00 F4 60 42 00  [email protected]鬬B.
0018FF24  10 61 42 00 02 00 00 00 E8 60 42  .aB.....鑐B

00410645   lea         ecx,[ebp-1Ch]		 ECX = 0018FF2C
ebp-24h ebp-1ch  8byte
0041064D   mov         dword ptr [ebp-40h],0
00410654   mov         edx,dword ptr [ebp-40h]	EDX = 0018FF2C

101:      pFurniture->m_nPrice = 88;
0041065A   mov         eax,dword ptr [ebp-2Ch]
0041065D   mov         dword ptr [eax+4],58h
102:      pSofa->m_nColor = 8;
00410664   mov         ecx,dword ptr [ebp-30h]
00410667   mov         dword ptr [ecx+8],8
103:      pSofa->m_nPrice = 90;
0041066E   mov         edx,dword ptr [ebp-30h]
00410671   mov         eax,dword ptr [edx+4]
00410674   mov         ecx,dword ptr [eax+4]
00410677   mov         edx,dword ptr [ebp-30h]
0041067A   mov         dword ptr [edx+ecx+8],5Ah
104:      pBed->m_nLength = 13;
00410682   mov         eax,dword ptr [ebp-34h]
00410685   mov         dword ptr [eax+8],0Dh
105:      pBed->m_nWidth = 66;
0041068C   mov         ecx,dword ptr [ebp-34h]
0041068F   mov         dword ptr [ecx+0Ch],42h
106:      SofaBed.m_nHeight = 45;
00410696   mov         dword ptr [ebp-0Ch],2Dh
107:      return 0;
0041069D   mov         dword ptr [ebp-38h],0
004106A4   lea         ecx,[ebp-28h]
004106A7   call        @ILT+40(CSofaBed::`vbase destructor') (0040102d)
004106AC   mov         eax,dword ptr [ebp-38h]
108:  }

 EBP = 0018FF48		ebp-2ch	0x18ff1c
 EAX = 0018FF40
0041065D   mov         dword ptr [eax+4],58h
0018FF1C  40 FF 18 00 F4 60 42 00 10 61 42  @...鬬B..aB
0018FF27  00 02 00 00 00 E8 60 42 00 04 61  .....鑐B..a
0018FF32  42 00 02 00 00 00 01 00 00 00 06  B..........
0018FF3D  00 00 00 DC 60 42 00 58 00 00 00  ...躟B.X...	0x58
0018FF48  88 FF 18 00 29 32 40 00 01 00 00  ....)[email protected]
0018FF53  00 B8 19 87 00 30 1A 87 00 00 00  .....0.....

00410664   mov         ecx,dword ptr [ebp-30h]
ECX = 0018FF20
00410667   mov         dword ptr [ecx+8],8
0018FF11  CC CC CC 2C FF 18 00 20 FF 18 00  烫.,... ...
0018FF1C  40 FF 18 00 F4 60 42 00 10 61 42  @...鬬B..aB
0018FF27  00 08 00 00 00 E8 60 42 00 04 61  .....鑐B..a	0x08
0018FF32  42 00 02 00 00 00 01 00 00 00 06  B..........
0018FF3D  00 00 00 DC 60 42 00 58 00 00 00  ...躟B.X...
0018FF48  88 FF 18 00 29 32 40 00 01 00 00  ....)[email protected]
0018FF53  00 B8 19 87 00 30 1A 87 00 00 00  .....0.....

0041066E   mov         edx,dword ptr [ebp-30h]
EDX = 0018FF20
00410671   mov         eax,dword ptr [edx+4]
EAX = 00426110
00410674   mov         ecx,dword ptr [eax+4]	 ECX = 0000001C 

0041067A   mov         dword ptr [edx+ecx+8],5Ah
0018FF11  CC CC CC 2C FF 18 00 20 FF 18 00  烫.,... ...
0018FF1C  40 FF 18 00 F4 60 42 00 10 61 42  @...鬬B..aB
0018FF27  00 08 00 00 00 E8 60 42 00 04 61  .....鑐B..a
0018FF32  42 00 02 00 00 00 01 00 00 00 06  B..........
0018FF3D  00 00 00 DC 60 42 00 5A 00 00 00  ...躟B.Z...		0x5a 90
0018FF48  88 FF 18 00 29 32 40 00 01 00 00  ....)[email protected]
0018FF53  00 B8 19 87 00 30 1A 87 00 00 00  .....0.....
 EAX = 00426110 EBX = 7EFDE000
 ECX = 0000001C EDX = 0018FF20
 ESI = 00000000 EDI = 0018FF48
 EIP = 00410682 ESP = 0018FEBC
 EBP = 0018FF48 EFL = 00000202

00410682   mov         eax,dword ptr [ebp-34h]
00410685   mov         dword ptr [eax+8],0Dh

0018FF1C  40 FF 18 00 F4 60 42 00 10 61 42  @...鬬B..aB
0018FF27  00 08 00 00 00 E8 60 42 00 04 61  .....鑐B..a
0018FF32  42 00 0D 00 00 00 01 00 00 00 06  B..........
0018FF3D  00 00 00 DC 60 42 00 5A 00 00 00  ...躟B.Z...
0018FF48  88 FF 18 00 29 32 40 00 01 00 00  ....)[email protected]
0018FF53  00 B8 19 87 00 30 1A 87 00 00 00  .....0.....
0018FF5E  00 00 00 00 00 00 00 E0 FD 7E 00  .......帻~.

104:      pBed->m_nLength = 13;
00410682   mov         eax,dword ptr [ebp-34h]
00410685   mov         dword ptr [eax+8],0Dh
105:      pBed->m_nWidth = 66;
0041068C   mov         ecx,dword ptr [ebp-34h]
0041068F   mov         dword ptr [ecx+0Ch],42h
106:      SofaBed.m_nHeight = 45;
00410696   mov         dword ptr [ebp-0Ch],2Dh
107:      return 0;
0041069D   mov         dword ptr [ebp-38h],0

 EAX = 0018FF2C EBX = 7EFDE000
 ECX = 0018FF2C EDX = 0018FF20
 ESI = 00000000 EDI = 0018FF48
 EIP = 004106A4 ESP = 0018FEBC
 EBP = 0018FF48 EFL = 00000202

0018FF06  CC CC 2C FF 18 00 40 FF 18 00 00  烫,[email protected]
0018FF11  00 00 00 2C FF 18 00 20 FF 18 00  ...,... ...
0018FF1C  40 FF 18 00 F4 60 42 00 10 61 42  @...鬬B..aB
0018FF27  00 08 00 00 00 E8 60 42 00 04 61  .....鑐B..a
0018FF32  42 00 0D 00 00 00 42 00 00 00 2D  B.....B...-	m_nHeight = 45;
0018FF3D  00 00 00 DC 60 42 00 5A 00 00 00  ...躟B.Z...
0018FF48  88 FF 18 00 29 32 40 00 01 00 00  ....)[email protected]

0018FF06  CC CC
		2C FF 18 00
		40 FF 18 00
		00 00 00 00 烫,[email protected]
		2C FF 18 00
		20 FF 18 00  ...,... ...
0018FF1C  	40 FF 18 00
		F4 60 42 00 	this指针 ebp-28h	ebp xx480
		10 61 42 00 @...鬬B..aB
		08 00 00 00 		pSofa->m_nColor = 8;
		E8 60 42 00
	 	04 61 42 00   .....鑐B..a
		0D 00 00 00 		pBed->m_nLength = 13;
		42 00 00 00 		pBed->m_nWidth = 66;
		2D 00 00 00  B.....B...-	SofaBed.m_nHeight = 45;
		DC 60 42 00
		5A 00 00 00  ...躟B.Z...	pSofa->m_nPrice = 90;覆盖88
0018FF48  88 FF 18 00 29 32 40 00 01 00 00  ....)[email protected]

class CSofaBed : public CSofa , public CBed
{
public:
	class CFurniture
	{
	public:
		int m_nPrice;
	};
	class CSofa : virtual public CFurniture
	{
		public:
			int m_nColor;
	};
	class CBed : virtual public CFurniture
	{
	public:
		int m_nLength;
		int m_nWidth;
	};
public:
	int m_nHeight;
};

		F4 60 42 00 	this指针 ebp-28h	ebp xx48h	第一个基类以定义的虚函数
		10 61 42 00 @...鬬B..aB 	CSofa数据区域
		08 00 00 00 		pSofa->m_nColor = 8;
		E8 60 42 00			第二个父类以定义的虚函数
	 	04 61 42 00   .....鑐B..a	第二个父类区域
		0D 00 00 00 		pBed->m_nLength = 13;
		42 00 00 00 		pBed->m_nWidth = 66;
		2D 00 00 00  B.....B...-	SofaBed.m_nHeight = 45;	本类成员变量区域
		DC 60 42 00 			祖父类数据区域
		5A 00 00 00  ...躟B.Z...	pSofa->m_nPrice = 90;覆盖88

004260E4  00000000  004010CD  00401078  00000000
004260F4  0040108C  00401005  004010DC  00000000  所有虚函数地址,以0结束。
00426104  FFFFFFFC  00000010  00000000  FFFFFFFC
00426114  0000001C  00000000  004010EB  004010F0
00426124  00000000  74726976  206C6175  7546437E

00410615   lea         eax,[ebp-28h]
@ILT+135([email protected]@@UAEHXZ):
0040108C   jmp         CSofa::GeyColor (00402460)

	   虚函数表地址
0018FF20  004260F4  00426110  00000002  004260E8
0018FF30  00426104  00000002  00000001  00000006
0018FF40  004260DC  00000003  0018FF88  00403229
0018FF50  00000001  001F19B8  001F1A30  00000000  

@ILT+200([email protected]@@UAEHXZ):
004010CD   jmp         CBed::GetArea (00402690)

004260C4  206C6175  6C696863  00000A64  00000000
004260D4  00401118  00403130  00401032  004010F0
004260E4  00000000  004010CD  00401078  00000000
004260F4  0040108C  00401005  004010DC  00000000
00426104  FFFFFFFC  00000010  00000000  FFFFFFFC
00426114  0000001C  00000000  004010EB  004010F0
00426124  00000000  74726976  206C6175  7546437E

FFFFFFFC  00000010  00000000表示没有。空表。

虚表地址都一样,static存储结构。
同类对象共享一个虚表。

004020F2   mov         dword ptr [eax+4],offset CSofaBed::`vbtable' (00426110)
004020F9   mov         ecx,dword ptr [ebp-10h]

0018FF20  CCCCCCCC  00426110  CCCCCCCC  CCCCCCCC
0018FF30  CCCCCCCC  CCCCCCCC  CCCCCCCC  CCCCCCCC
0018FF40  CCCCCCCC  CCCCCCCC  0018FF88  00403229
0018FF50  00000001  002819B8  00281A30  00000000
0018FF60  00000000  7EFDE000  00000000  00000000

00426100  0040114A  FFFFFFFC  00000010  00000000
00426110  FFFFFFFC  0000001C  00000000  004010EB
00426120  004010F0  00000000  74726976  206C6175

0018FF20  CCCCCCCC  00426110  CCCCCCCC  CCCCCCCC
0018FF30  00426104  CCCCCCCC  CCCCCCCC  CCCCCCCC
0018FF40  CCCCCCCC  CCCCCCCC  0018FF88  00403229
0018FF50  00000001  002819B8  00281A30  00000000
004020FC   mov         dword ptr [ecx+10h],offset CSofaBed::`vbtable' (00426104)
004260F4  0040108C  00401005  004010DC  0040114A
00426104  FFFFFFFC  00000010  00000000  FFFFFFFC
00426114  0000001C  00000000  004010EB  004010F0

5:        CFurniture()
004021D0   push        ebp
004021D1   mov         ebp,esp
004021D3   sub         esp,44h
004021D6   push        ebx
004021D7   push        esi
004021D8   push        edi
004021D9   push        ecx
004021DA   lea         edi,[ebp-44h]
004021DD   mov         ecx,11h
004021E2   mov         eax,0CCCCCCCCh
004021E7   rep stos    dword ptr [edi]
004021E9   pop         ecx
004021EA   mov         dword ptr [ebp-4],ecx
004021ED   mov         eax,dword ptr [ebp-4]
004021F0   mov         dword ptr [eax],offset CFurniture::`vftable' (0042611c)

	0018FF40
0018FF20  CCCCCCCC  00426110  CCCCCCCC  CCCCCCCC
0018FF30  00426104  CCCCCCCC  CCCCCCCC  CCCCCCCC
0018FF40  0042611C  CCCCCCCC  0018FF88  00403229

0042611C  004010EB  004010F0  00000000  74726976
0042612C  206C6175  7546437E  74696E72  28657275

00402378   mov         edx,dword ptr [ebp-4]
0040237B   mov         dword ptr [edx],offset CSofa::`vftable' (00426150)

 EAX = CCCCCCCC EBX = 7EFDE000
 ECX = 0018FF20 EDX = 0018FF20
 ESI = 00000000 EDI = 0018FE44
 EIP = 0040237B ESP = 0018FDF0
 EBP = 0018FE44 EFL = 00000246
0018FF20  00426150  00426110  CCCCCCCC  CCCCCCCC
0018FF30  00426104  CCCCCCCC  CCCCCCCC  CCCCCCCC
0018FF40  0042611C  00000000  0018FF88  00403229
0018FF50  00000001  002819B8  00281A30  00000000

0040238A   mov         eax,dword ptr [ebp-4]
0040238D   mov         dword ptr [eax+edx+4],offset CSofa::`vftable' (00426144)

0018FF20  00426150  00426110  CCCCCCCC  CCCCCCCC
0018FF30  00426104  CCCCCCCC  CCCCCCCC  CCCCCCCC
0018FF40  00426144  00000000  0018FF88  00403229
0018FF50  00000001  002819B8  00281A30  00000000

00402608   mov         edx,dword ptr [ebp-4]
0040260B   mov         dword ptr [edx],offset CBed::`vftable' (004261b0)
 EAX = CCCCCCCC EBX = 7EFDE000
 ECX = 0018FF2C EDX = 0018FF2C
 ESI = 00000000 EDI = 0018FE44
 EIP = 00402611 ESP = 0018FDF0
 EBP = 0018FE44 EFL = 00000246
0018FF20  00426150  00426110  00000002  004261B0
0018FF30  00426104  CCCCCCCC  CCCCCCCC  CCCCCCCC
0018FF40  00426144  00000001  0018FF88  00403229
0018FF50  00000001  002819B8  00281A30  00000000

00402617   mov         edx,dword ptr [ecx+4]
0040261A   mov         eax,dword ptr [ebp-4]
0040261D   mov         dword ptr [eax+edx+4],offset CBed::`vftable' (004261a4)

0018FF20  00426150  00426110  00000002  004261B0
0018FF30  00426104  CCCCCCCC  CCCCCCCC  CCCCCCCC
0018FF40  004261A4  00000001  0018FF88  00403229
0018FF50  00000001  002819B8  00281A30  00000000

0040213C   mov         eax,dword ptr [ebp-10h]
0040213F   mov         dword ptr [eax],offset CSofaBed::`vftable' (004260f4)

0018FF20  004260F4  00426110  00000002  004261B0
0018FF30  00426104  00000002  00000001  CCCCCCCC
0018FF40  004261A4  00000003  0018FF88  00403229
0018FF50  00000001  002819B8  00281A30  00000000

00402145   mov         ecx,dword ptr [ebp-10h]
00402148   mov         dword ptr [ecx+0Ch],offset CSofaBed::`vftable' (004260e8)

0018FF20  004260F4  00426110  00000002  004260E8
0018FF30  00426104  00000002  00000001  CCCCCCCC
0018FF40  004261A4  00000003  0018FF88  00403229
0018FF50  00000001  002819B8  00281A30  00000000

00402155   mov         ecx,dword ptr [eax+4]
00402158   mov         edx,dword ptr [ebp-10h]
0040215B   mov         dword ptr [edx+ecx+4],offset CSofaBed::`vftable' (004260dc)

0018FF20  004260F4  00426110  00000002  004260E8
0018FF30  00426104  00000002  00000001  CCCCCCCC
0018FF40  004260DC  00000003  0018FF88  00403229
0018FF50  00000001  002819B8  00281A30  00000000

00426084  00000000  0040100F  0040105F  004010C8
00426094  00000000  656D4143  61636972  0000006E
004260A4  00401091  0040105F  00401037  00000000
004260B4  72654743  006E616D  00000000  74726976
004260C4  206C6175  6C696863  00000A64  00000000
004260D4  00401118  00403130  00401032  004010F0	祖父类
004260E4  00000000  004010CD  00401078  00000000  	~CBed
004260F4  0040108C  00401005  004010DC  0040114A  	~CSofa
00426104  FFFFFFFC  00000010  00000000  FFFFFFFC  	CBed , CSofa
00426114  0000001C  00000000  004010EB  004010F0
00426124  00000000  74726976  206C6175  7546437E
00426134  74696E72  28657275  00000A29  00000000
00426144  0040109B  004010F0  00000000  0040108C
00426154  00401041  00000000  FFFFFFFC  00000008
00426164  00000000  74726976  206C6175  6F53437E
00426174  29286166  0000000A  00000000  20746953
00426184  6E776F64  646E6120  73657220  6F792074
00426194  6C207275  0A736765  00000000  00000000
004261A4  0040110E  004010F0  00000000  004010CD
004261B4  004010D7  00000000  FFFFFFFC  0000000C
004261C4  00000000  74206F67  6C73206F  21706565
004261D4  0000000A  74726976  206C6175  6542437E
004261E4  0A292864  00000000  20746953  6E776F44
004261F4  206E6F20  20656874  61666F73  64656220
00426204  0000000A  00000000  74206F67  6C73206F
00426214  20706565  74206E6F  73206568  2061666F

F4 60 42 00 	this指针 ebp-28h	ebp xx48h	第一个基类未定义的虚函数
		10 61 42 00 @...鬬B..aB 	CSofa数据区域
		08 00 00 00 		pSofa->m_nColor = 8;
		E8 60 42 00			第二个父类未定义的虚函数
	 	04 61 42 00   .....鑐B..a	第二个父类区域
		0D 00 00 00 		pBed->m_nLength = 13;
		42 00 00 00 		pBed->m_nWidth = 66;
		2D 00 00 00  B.....B...-	SofaBed.m_nHeight = 45;	本类成员变量区域
		DC 60 42 00 			祖父类数据区域
		5A 00 00 00  ...躟B.Z...	pSofa->m_nPrice = 90;覆盖88

0018FF20  004260F4  00426110  00000002  004260E8
0018FF30  00426104  00000002  00000001  00000006
0018FF40  004260DC  00000003  0018FF88  00403229
0018FF50  00000001  002819B8  00281A30  00000000

00401005	@ILT+0([email protected]@@UAEHXZ):
00401005   jmp         CSofaBed::SitDown (00402860)

0040114A   jmp         CSofaBed::Show (00402940)

@ILT+0([email protected]@@UAEHXZ):
00401005   jmp         CSofaBed::SitDown (00402860)
@ILT+5([email protected]@[email protected]):
0040100A   jmp         CGerman::`scalar deleting destructor' (00401e80)
@ILT+10([email protected]@[email protected]):
0040100F   jmp         CAmerican::`scalar deleting destructor' (00401c90)
@ILT+15([email protected]@@[email protected]):
00401014   jmp         CBase::SetNumber (004013c0)
@ILT+20([email protected]@@UAEPADXZ):
00401019   jmp         CChinese::GetClassName (00401a60)
@ILT+25([email protected]@[email protected]):
0040101E   jmp         CSofaBed::CSofaBed (004020b0)
@ILT+30([email protected]@[email protected]):
00401023   jmp         CVirtualBase::CVirtualBase (00402010)
@ILT+35([email protected]@[email protected]):
00401028   jmp         CBase::~CBase (00401530)
@ILT+40([email protected]@QAEXXZ):
0040102D   jmp         CSofaBed::`vbase destructor' (00402a10)
@ILT+45([email protected]@[email protected]):
00401032   jmp         CSofaBed::`scalar deleting destructor' (004029b0)
@ILT+50([email protected]@@UAEPADXZ):
00401037   jmp         CGerman::GetClassName (00401e40)
@ILT+55([email protected]@@[email protected]):
0040103C   jmp         CDerive::ShowNumber (00401330)
@ILT+60([email protected]@@UAEHXZ):
00401041   jmp         CSofa::SitDown (004024a0)
@ILT+65([email protected]@QAEXXZ):
00401046   jmp         CSofa::`vbase destructor' (00402560)
@ILT+70([email protected]@[email protected]):
0040104B   jmp         CGerman::CGerman (00401d00)
@ILT+75([email protected]@[email protected]):
00401050   jmp         CAmerican::CAmerican (00401b10)
@ILT+80([email protected]@[email protected]):
00401055   jmp         CChinese::CChinese (00401750)
@ILT+85([email protected]@QAEXXZ):
0040105A   jmp         CBed::`vbase destructor' (00402790)
@ILT+90([email protected]@@UAEXXZ):
0040105F   jmp         CPerson::ShowSpeak (004018a0)
@ILT+95([email protected]@[email protected]):
00401064   jmp         CPerson::`scalar deleting destructor' (00401950)
@ILT+100([email protected]@[email protected]):
00401069   jmp         CPerson::~CPerson (00401850)
@ILT+105([email protected]@@QAEHXZ):
0040106E   jmp         CBase::GetNumber (00401400)
@ILT+110([email protected]@[email protected]):
00401073   jmp         CDerive::CDerive (00401440)
@ILT+115([email protected]@@UAEHXZ):
00401078   jmp         CSofaBed::Sleep (004028b0)
@ILT+120([email protected]@[email protected]):
0040107D   jmp         CFurniture::CFurniture (004021d0)
@ILT+125([email protected]@YAHXZ):
00401082   jmp         main4 (00401690)
@ILT+130([email protected]@[email protected]):
00401087   jmp         CGerman::~CGerman (00401da0)
@ILT+135([email protected]@@UAEHXZ):
0040108C   jmp         CSofa::GeyColor (00402460)
@ILT+140([email protected]@[email protected]):
00401091   jmp         CGerman::`scalar deleting destructor' (00401e80)
@ILT+145([email protected]@[email protected]):
00401096   jmp         CDerive::~CDerive (004014e0)
@ILT+150([email protected]@[email protected]):
0040109B   jmp         CSofa::`scalar deleting destructor' (004024f0)
@ILT+155([email protected]@[email protected]):
004010A0   jmp         CPerson::CPerson (004017f0)
@ILT+160([email protected]@[email protected]):
004010A5   jmp         CChinese::`scalar deleting destructor' (00401aa0)
@ILT+165([email protected]@[email protected]):
004010AA   jmp         CAmerican::~CAmerican (00401bb0)
@ILT+170([email protected]@YAHXZ):
004010AF   jmp         main2 (00401600)
@ILT+175([email protected]@[email protected]):
004010B4   jmp         CFurniture::~CFurniture (00402220)
@ILT+180([email protected]@@UAEPADXZ):
004010B9   jmp         CPerson::GetClassName (00401910)
@ILT+185([email protected]@[email protected]):
004010BE   jmp         CChinese::~CChinese (004019c0)
@ILT+190([email protected]@[email protected]):
004010C3   jmp         CBed::`scalar deleting destructor' (00402720)
@ILT+195([email protected]@@UAEPADXZ):
004010C8   jmp         CAmerican::GetClassName (00401c50)
@ILT+200([email protected]@@UAEHXZ):
004010CD   jmp         CBed::GetArea (00402690)
@ILT+205([email protected]@[email protected]):
004010D2   jmp         CBed::~CBed (004027f0)
@ILT+210([email protected]@@UAEHXZ):
004010D7   jmp         CBed::Sleep (004026d0)
@ILT+215([email protected]@@UAEHXZ):
004010DC   jmp         CSofaBed::GetHeight (00402900)
@ILT+220([email protected]@[email protected]):
004010E1   jmp         CSofaBed::~CSofaBed (004106d0)
@ILT+225(_main):
004010E6   jmp         main (004105f0)
@ILT+230([email protected]@[email protected]):
004010EB   jmp         CFurniture::`scalar deleting destructor' (004022c0)
@ILT+235([email protected]@@UAEHXZ):
004010F0   jmp         CFurniture::GetPrice (00402280)
@ILT+240([email protected]@[email protected]):
004010F5   jmp         CBase::CBase (00401490)
@ILT+245([email protected]@[email protected]):
004010FA   jmp         CSofa::CSofa (00402330)
@ILT+250([email protected]@YAHXZ):
004010FF   jmp         main6 (00401ef0)
@ILT+255([email protected]@YAHXZ):
00401104   jmp         main3 (00401580)
@ILT+260([email protected]@[email protected]):
00401109   jmp         CSofa::`scalar deleting destructor' (004024f0)
@ILT+265([email protected]@[email protected]):
0040110E   jmp         CBed::`scalar deleting destructor' (00402720)
@ILT+270([email protected]@[email protected]):
00401113   jmp         main1 (00401290)
@ILT+275([email protected]@@UAEXXZ):
00401118   jmp         CVirtualChild::show (00401f60)
@ILT+280([email protected]@[email protected]):
0040111D   jmp         CSofa::~CSofa (004023f0)
@ILT+285([email protected]@[email protected]):
00401122   jmp         CBed::CBed (004025c0)
@ILT+290([email protected]@[email protected]):
00401127   jmp         CAmerican::`scalar deleting destructor' (00401c90)
@ILT+295([email protected]@[email protected]@@Z):
0040112C   jmp         speak (00401640)
@ILT+300([email protected]@[email protected]):
00401131   jmp         CFurniture::`scalar deleting destructor' (004022c0)
@ILT+305([email protected]@[email protected]):
00401136   jmp         CPerson::`scalar deleting destructor' (00401950)
@ILT+310([email protected]@[email protected]):
0040113B   jmp         CSofaBed::`scalar deleting destructor' (004029b0)
@ILT+315([email protected]@[email protected]):
00401140   jmp         CVirtualChild::CVirtualChild (00401fb0)
@ILT+320([email protected]@[email protected]):
00401145   jmp         CChinese::`scalar deleting destructor' (00401aa0)
0040114A   jmp         CSofaBed::Show (00402940)

@ILT+135([email protected]@@UAEHXZ):
0040108C   jmp         CSofa::GeyColor (00402460)

@ILT+215([email protected]@@UAEHXZ):
004010DC   jmp         CSofaBed::GetHeight (00402900)

0018FF0C  CCCCCCCC  CCCCCCCC  CCCCCCCC
0018FF18  00426110  CCCCCCCC  CCCCCCCC  00426110 00426104Sofa类虚表
0018FF24  00426104  CCCCCCCC  CCCCCCCC
0018FF30  CCCCCCCC  0042611C  00000000  0042611c祖父类虚表
0018FF3C  0018FF78  00414D69  FFFFFFFF
0018FF48  0018FF88  00403229  00000001

0018FF0C  CCCCCCCC  CCCCCCCC  00426150  00426150
0018FF18  00426110  CCCCCCCC  CCCCCCCC
0018FF24  00426104  CCCCCCCC  CCCCCCCC
0018FF30  CCCCCCCC  00426144  00000000  00426144 CSofa
0018FF3C  0018FF78  00414D69  FFFFFFFF
0018FF48  0018FF88  00403229  00000001

0018FF0C  CCCCCCCC  CCCCCCCC  00426150
0018FF18  00426110  00000002  004261B0    004261b0 004261a4 CBed类虚函数表
0018FF24  00426104  CCCCCCCC  CCCCCCCC
0018FF30  CCCCCCCC  004261A4  00000001
0018FF3C  0018FF78  00414D69  FFFFFFFF
0018FF48  0018FF88  00403229  00000001

0018FF0C  CCCCCCCC  CCCCCCCC  004260F4  004260F4 E8 DC CSofaBed类虚表
0018FF18  00426110  00000002  004260E8
0018FF24  00426104  00000002  00000001
0018FF30  CCCCCCCC  004260DC  00000003
0018FF3C  0018FF78  00414D69  FFFFFFFF
0018FF48  0018FF88  00403229  00000001

aBed::`vbase destructor‘:004029B0 push ebp004029B1 mov ebp,esp004029B3 sub esp,44h004029B6 push ebx004029B7 push esi004029B8 push edi004029B9 push ecx004029BA lea edi,[ebp-44h]004029BD mov ecx,11h004029C2 mov eax,0CCCCCCCCh004029C7 rep stos dword ptr [edi]004029C9
pop ecx004029CA mov dword ptr [ebp-4],ecx004029CD mov ecx,dword ptr [ebp-4]004029D0 add ecx,20h004029D3 call @ILT+220(CSofaBed::~CSofaBed) (004010e1)004029D8 mov ecx,dword ptr [ebp-4]004029DB add ecx,20h004029DE call @ILT+175(CFurniture::~CFurniture) (004010b4)004029E3
pop edi004029E4 pop esi004029E5 pop ebx004029E6 add esp,44h004029E9 cmp ebp,esp004029EB call __chkesp (00402ef0)004029F0 mov esp,ebp004029F2 pop ebp004029F3 ret

				
时间: 2024-10-24 16:45:28

cpp反汇编之菱形继承的相关文章

cpp反汇编之多继承

源码 #include<stdio.h> class CSoft { public: CSoft() { m_nColor = 2; } virtual ~CSoft() { printf("virtual ~CSoft()\n"); } virtual int GetColor() { return m_nColor; } virtual int SitDown() { return printf("Sit down and rest your legs!\n&

C++反汇编第四讲,认识多重继承,菱形继承的内存结构,以及反汇编中的表现形式.

目录: 1.多重继承在内存中的表现形式 多重继承在汇编中的表现形式 2.菱形继承 普通的菱形继承 虚继承 汇编中的表现形式 一丶多重继承在内存中的表现形式 高级代码: class Father1 { public: Father1(){}//空构造 virtual ~Father1(){} //空析构 virtual void Player(){} //玩耍的函数 int m_price;//金钱 }; class Father2 { public: Father2(){} virtual ~F

C++继承详解之三——菱形继承+虚继承内存对象模型详解vbptr(1)

在我个人学习继承的过程中,在网上查阅了许多资料,这些资料中有关菱形继承的知识都是加了虚函数的,也就是涉及了多态的问题,而我在那个时候并没有学习到多态这一块,所以看很多资料都是云里雾里的,那么这篇文章我想以我自己学习过程中的经验,由简到较难的先分析以下菱形继承,让初学者先对这个问题有一点概念,在后面会由浅入深的继续剖析. 本篇文章不会涉及到多态也就是虚函数的菱形继承,在后面的文章更新中,我会慢慢把这些内容都加进去. 菱形继承(也叫钻石继承)是下面的这种情况: 对应代码如下: #include <i

C++之菱形继承

当我们谈C++时,我们谈些什么? 封装,继承,多态.这是C++语言的三大特性,而每次在谈到继承时我们不可避免的要谈到一个很重要的问题--菱形继承. a.菱形继承是什么 如上图,菱形继承即多个类继承了同一个公共基类,而这些派生类又同时被一个类继承.这么做会引发什么问题呢,让我们来看一段代码吧! #include<iostream> using namespace std; class Base { protected: int _base; public: void fun() { cout &

C++对象内存分布(2) - 菱形继承(non virtual)

1.前言 本篇文章的所有代码例子,如果是windows上编译运行,则使用的是visual studio 2013.如果是RHEL6.5平台(linux kernal: 2.6.32-431.el6.i686)上编译运行,则其gcc版本为4.4.7,如下所示: [[email protected] ~]# gcc --version gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4) 2.菱形继承类的内存分布 2.1.类的结构 菱形继承 - 重复继承 2.2.实现

处理菱形继承问题&&实现一个虚函数的覆盖及调用&&实现以下几个类的成员函数

#include <iostream> #include <string> using namespace std; 1.实现以下几个类的成员函数 2.实现一个虚函数的覆盖及调用 3.处理菱形继承问题. 植物 class Botany { public: //(const string& name) // const char* name Botany(const char* name = "") :_name(name) //构造函数 { //cout

C++中的类继承之单继承&amp;多继承&amp;菱形继承

 C++中的类继承之单继承&多继承&菱形继承 单继承是一般的单一继承,一个子类只 有一个直接父类时称这个继承关系为单继承.这种关系比较简单是一对一的关系: 多继承是指 一个子类有两个或以上直接父类时称这个继承关系为多继承.这种继承方式使一个子类可以继承多个父类的特性.多继承可以看作是单继承的扩展.派生类具有多个基类,派生类与每个基类之间的关系仍可看作是一个单继承.多继承下派生类的构造函数与单继承下派生类构造函数相似,它必须同时负责该派生类所有基类构造函数的调用.同时,派生类的参数个数必须包

菱形继承问题(钻石问题)

在学习C++的时候,菱形继承问题绝对是一个不可避免的重点问题,那么什么是菱形继承问题呢?下图就是,长得像不像钻石?我画图确实很难看 因为C++允许多继承,当继承关系像上图这样子的时候,就会出现这样子的情况 A类是基类,B里面有个A我表示为B(A),C里面有个A我表示为C(A) 那么D里面有B和C我表示为D(B(A)C(A)) 当我们想去使用D里面的A的时候,或者说访问A的部分值,在说白了究竟哪个A才是属于D的,D中的A究竟是B的A还是C的A? 1 class A 2 {}; 3 class B

c++ 植物类 继承多态 菱形继承

#pragma once//头文件 #include <iostream> #include<string> using namespace std; // // 1.实现以下几个类的成员函数 // 2.实现一个虚函数的覆盖及调用 // 3.处理菱形继承问题. // // 植物 class Botany { public: Botany(const string&  name); virtual ~Botany(); virtual void Display(); Bota