Znn3bq.jpeg
²é¿´: 179  |  »Ø¸´: 1
µ±Ç°Ö÷ÌâÒѾ­´æµµ¡£

zsglly

ľ³æ (ÖøÃûдÊÖ)

[½»Á÷] ÎÒ¿´vc6ÖÐÐé¼Ì³ÐµÄʵÏÖ

ÕâÁ½ÌìÊÔÁËһϣ¬À´ËµÁ½¾ä

ÒòÊÖÍ·ÉÏÖ»ÓÐvc6±àÒëÆ÷£¬¹ÊÖ»¿´ÁËvc6µÄ·½Ê½

ÎҵIJâÊÔ³ÌÐòÈçÏÂ
#include "stdafx.h"
class mostbase1
{
public:
mostbase1():i(1){};
int i;
};
class mostbase2
{
public:
mostbase2():j(2){};
int j;
};

class base1:public virtual mostbase1,public virtual mostbase2
{
};
class base2:public virtual mostbase1,public virtual mostbase2
{
};
class derived:public base1,public base2
{
};
void f(derived* pderived)
{
mostbase1* pbase1 = pderived;
mostbase2* pbase2 = pderived;
int k = pderived->i;
k = pderived->j;
k = pbase1->i;
k = pbase2->j;
}
int main(int argc, char* argv[])
{
derived d;
f(&d);
printf("Hello World!\n";
return 0;
}
¾­¹ýÎҵIJâÊÔ¼°²é¿´»ã±à´úÂ룬µÃÖªvcµÄÐé»ùÀàת»»È·ÈçInside the c++ objects modelÖÐËù˵ÊÇÓÃÒ»¸övirtual base class tableÀ´ÊµÏÖµÄ
base1ºÍbase2Öи÷ÓÐÒ»¸ö__vbct__ptr(´óСÊÇ4¸ö×Ö½Ú)ÓÃÀ´Ö¸ÏòÒ»¸övirtual base class table£¬¸Ã±í¸ñ´æ´¢×ÅbaseÀàÖÐÐé»ùÀàÔÚbaseÀàÖÐµÄÆ«ÒÆ£¬Æäºó¾ÍÊÇÊý¾Ý£¬µ±derived¼Ì³Ð×Ôbase1ºÍbase2,Ê×ÏÈÊÇ´æ·Åbase1ºÍbase2µÄ__vbct_ptr£¬ÔÙ¾ÍÊÇÊý¾Ý£¬½«base1ºÍbase2Ïàͬ»ùÀàµÄÊý¾Ý·Åµ½Ò»Æð
base1ÀàµÄÄÚ´æ²¼¾ÖÈçÏÂ(base2Óëbase1Ïàͬ):
pvoid* __vbct_base1  ----ÏÈÊÇÐé»ùÀà±íµÄµØÖ·£¬´Ëʱ__vbct_base1Êý¾ÝÈçÏÂ
      ----00 00 00 00 04 00 00 00 08 00 00 00
      ----mostbase1ÔÚbase1ÖÐµÄÆ«ÒÆÎª[__vbct_base1+4]µÄÖµ
int i;     ----mostbase1ÀàÖеÄi
int j;     ----mostbase2ÀàÖеÄj

derivedÀàµÄÄÚ´æ²¼¾ÖÈçÏÂ:
pvoid* __vbct_base1; ----base1ÀàµÄÐé»ùÀà±íµÄµØÖ·£¬ÆäÖеÄÖµÓб仯£¬Êý¾ÝÈçÏÂ
                                ----00 00 00 00 08 00 00 00 0C 00 00 00
pvoid* __vbct_base2; ----base2ÀàµÄÐé»ùÀà±íµÄµØÖ·£¬Êý¾ÝÈçÏÂ
                                ----00 00 00 00 04 00 00 00 08 00 00 00
int i;
int j;

  


ÏÂÃæÊÇf(derived* pderived)º¯ÊýµÄ»ã±à´úÂ룬¶ÔÆäËü½øÐзÖÎö

29:   void f(derived* pderived)
30:   {
0040C230   push        ebp
0040C231   mov         ebp,esp
0040C233   sub         esp,60h
0040C236   push        ebx
0040C237   push        esi
0040C238   push        edi
0040C239   lea         edi,[ebp-60h]
0040C23C   mov         ecx,18h
0040C241   mov         eax,0CCCCCCCCh
0040C246   rep stos    dword ptr [edi]
31:       mostbase1* pbase1 = pderived;
0040C248   cmp         dword ptr [ebp+8],0          [1]
0040C24C   jne         f+27h (0040c257)
0040C24E   mov         dword ptr [ebp-18h],0        [2]
0040C255   jmp         f+35h (0040c265)
0040C257   mov         eax,dword ptr [ebp+8]
0040C25A   mov         ecx,dword ptr [eax]          [3]
0040C25C   mov         edx,dword ptr [ebp+8]
0040C25F   add         edx,dword ptr [ecx+4]        [4]
0040C262   mov         dword ptr [ebp-18h],edx
0040C265   mov         eax,dword ptr [ebp-18h]
0040C268   mov         dword ptr [ebp-4],eax        [5]
32:       mostbase2* pbase2 = pderived;
0040C26B   cmp         dword ptr [ebp+8],0
0040C26F   jne         f+4Ah (0040c27a)
0040C271   mov         dword ptr [ebp-1Ch],0        [6]
0040C278   jmp         f+58h (0040c288)
0040C27A   mov         ecx,dword ptr [ebp+8]
0040C27D   mov         edx,dword ptr [ecx]          [7]
0040C27F   mov         eax,dword ptr [ebp+8]   
0040C282   add         eax,dword ptr [edx+8]        [8]
0040C285   mov         dword ptr [ebp-1Ch],eax
0040C288   mov         ecx,dword ptr [ebp-1Ch]
0040C28B   mov         dword ptr [ebp-8],ecx
33:       base1* p1 = pderived;
0040C28E   mov         edx,dword ptr [ebp+8]
0040C291   mov         dword ptr [ebp-0Ch],edx      [9]
34:       p1->i = 1;
0040C294   mov         eax,dword ptr [ebp-0Ch]
0040C297   mov         ecx,dword ptr [eax]
0040C299   mov         edx,dword ptr [ecx+4]        [10]
0040C29C   mov         eax,dword ptr [ebp-0Ch]
0040C29F   mov         dword ptr [eax+edx],1
35:       base2* p2 = pderived;
0040C2A6   cmp         dword ptr [ebp+8],0
0040C2AA   je          f+87h (0040c2b7)
0040C2AC   mov         ecx,dword ptr [ebp+8]
0040C2AF   add         ecx,4                                 [11]
0040C2B2   mov         dword ptr [ebp-20h],ecx
0040C2B5   jmp         f+8Eh (0040c2be)
0040C2B7   mov         dword ptr [ebp-20h],0
0040C2BE   mov         edx,dword ptr [ebp-20h]
0040C2C1   mov         dword ptr [ebp-10h],edx      [12]
36:       p2->j = 1;
0040C2C4   mov         eax,dword ptr [ebp-10h]
0040C2C7   mov         ecx,dword ptr [eax]
0040C2C9   mov         edx,dword ptr [ecx+8]        [13]
0040C2CC   mov         eax,dword ptr [ebp-10h]
0040C2CF   mov         dword ptr [eax+edx],1
37:       int k = pderived->i;
0040C2D6   mov         ecx,dword ptr [ebp+8]
0040C2D9   mov         edx,dword ptr [ecx]
0040C2DB   mov         eax,dword ptr [edx+4]        [14]
0040C2DE   mov         ecx,dword ptr [ebp+8]
0040C2E1   mov         edx,dword ptr [ecx+eax]      [15]
0040C2E4   mov         dword ptr [ebp-14h],edx
38:       k = pderived->j;
0040C2E7   mov         eax,dword ptr [ebp+8]
0040C2EA   mov         ecx,dword ptr [eax]
0040C2EC   mov         edx,dword ptr [ecx+8]        [16]
0040C2EF   mov         eax,dword ptr [ebp+8]
0040C2F2   mov         ecx,dword ptr [eax+edx]
0040C2F5   mov         dword ptr [ebp-14h],ecx
39:
40:   }
0040C2F8   pop         edi
0040C2F9   pop         esi
0040C2FA   pop         ebx
0040C2FB   mov         esp,ebp
0040C2FD   pop         ebp
0040C2FE   ret

[ Last edited by »ÃÓ°ÎÞºÛ on 2006-11-27 at 08:18 ]
»Ø¸´´ËÂ¥

» ²ÂÄãϲ»¶

×öÈËÒªºñµÀ°¡£¡ºñµÀ°¡£¡
ÒÑÔÄ   »Ø¸´´ËÂ¥   ¹Ø×¢TA ¸øTA·¢ÏûÏ¢ ËÍTAºì»¨ TAµÄ»ØÌû

zsglly

ľ³æ (ÖøÃûдÊÖ)

[1]dword ptr [ebp+8h]¾ÍÊÇpderived£¬ÏÈ¿´¿´ÊDz»ÊÇΪNULL.
[2]dword ptr [ebp-18h]ÊÇÒ»¸öÖмä±äÁ¿£¬µ±pderivedΪNULLʱ£¬½«ÆäÒ²¸³ÎªNULL
[3]È¡³ö__vbct_base1£¬ÆäλÖÃÔÚderivedÀàµÄ¿ªÊ¼´¦
[4]È¡³ömostbast1ÀàÔÚderivedÖÐµÄÆ«ÒÆ£¬´ËÖµÔÚ_vbct_base1+4µÄλÖã¬Õ¼ÓÃ4¸ö×Ö½Ú£¬ÆäֵΪ8£¬ ÒòΪderivedǰÓÐÁ½¸ö__vbct_prt£¬¶¼Îª4×Ö½Ú£¬¹Êmostbast1ÔÚderivedµÄÆ«ÒÆÎª8.
[5]½«pbase1¸³Öµ£¬dword ptr [ebp-4]´æ·Åpbase1;
[6]ͬ(2)£¬Ö»ÊÇÖмä±äÁ¿µÄµØÖ·²»Í¬
[7]ͬ(3)£¬È¡³ö__vbct_base1
[8]ͬ(4), È¡³ömostbast2ÀàÔÚderivedÖÐµÄÆ«ÒÆ£¬´ËʱΪ12
[9]È¡³öderivedÀàÖеÄbase1µÄµØÖ·£¬Ò²¾ÍÊÇderivedÖÐ__vbct_base1µÄµØÖ·,¿ÉÄÜÄãÓÐÒÉÎÊ£¬¿´ÏÂÃæ
[10]ÓÃp1´æÈ¡Êý¾Ýʱ£¬»¹ÊÇͨ¹ý__vbct_base1À´×öµÄ£¬Í¨¹ý__vbct_base1µÃµ½mostbase1ÔÚderivedÖÐ µÄÆ«ÒÆ£¬×îºóµÃµ½µÄµØÖ·ÊÇpderived+8
[11]ÏÖÔÚÈ¡³ö__vbct_base2µÄµØÖ·£¬¿´µ½ÁËadd ecx,4ô
[12]½«p2¸³Öµ
[13]ͨ¹ý__vbct_base2À´È¡µÃmostbase2µÄµØÖ·£¬ÔÙÀ´´æÈ¡j
[14]ͨ¹ý__vbct_base1À´È¡µÃmostbase1µÄµØÖ·
[15]Æ«ÒÆÔÚeaxÖУ¬È¡³öiÀ´
[16]ͨ¹ý__vbct_base1À´È¡µÃmostbase2µÄµØÖ·

ÒÔÏÂÊÇÎÒ¹¹ÏëµÄcαÂ룬¿ÉÄܲ»Ì«ÕýÈ·£¬ÒòΪ»ã±à´úÂëÒѾ­ÓÅ»¯¹ý
void f(derived* pderived)
{
----mostbase1* pbase1 = pderived;
mostbase1 *pbase1,*temp1;
if (pderived == 0)
{
  temp1 = 0;
}
else
{
  temp1 = (mostbase1*)(pderived+(pderived->__vbct_base1[1]));
}
pbase1 = temp1;

----mostbase2* pbase2 = pderived;
mostbase2 *pbase2,*temp2;
if (pderived == 0)
{
  temp2 = 0;
}
else
{
  temp2 = (mostbase2*)(pderived+(pderived->__vbct_base1[2]));
}
pbase2 = temp2;
----base1* p1 = pderived;
base1* p1 = &pderived->__vbct_base1;
----p1->i = 1;
(mostbase1*)(p1+p1->__vbct_base1[1])->i = 1;
----base2* p2 = pderived;
base2* p2 = &pderived->__vbct_base2;
----p2->j = 1;
(mostbase2*)(p2+p2->__vbct_base2[2])->j = 1;
----int k = pderived->i;
int k = (mostbase1*)(pderived+pderived->__vbct_base1[1])->i;
----k = pderived->j;
k = (mostbase2*)(pderived+pderived->__vbct_base1[2])->j;
}
×öÈËÒªºñµÀ°¡£¡ºñµÀ°¡£¡
2Â¥2005-12-30 20:06:39
ÒÑÔÄ   »Ø¸´´ËÂ¥   ¹Ø×¢TA ¸øTA·¢ÏûÏ¢ ËÍTAºì»¨ TAµÄ»ØÌû
Ïà¹Ø°æ¿éÌø×ª ÎÒÒª¶©ÔÄÂ¥Ö÷ zsglly µÄÖ÷Ìâ¸üÐÂ
×î¾ßÈËÆøÈÈÌûÍÆ¼ö [²é¿´È«²¿] ×÷Õß »Ø/¿´ ×îºó·¢±í
[¿¼ÑÐ] 0831ÉúÒ½¹¤µÚÒ»ÂÖµ÷¼Áʧ°ÜÇóÖú +14 СÐÜî£î£_s 2026-04-11 18/900 2026-04-16 20:41 by lpl364211
[¿¼ÑÐ] ҩѧÇóµ÷¼Á +14 à¶¹þ¼ÓÓÍ 2026-04-14 16/800 2026-04-16 10:15 by beilsong20
[¿¼ÑÐ] Çóµ÷¼ÁÍÆ¼ö +8 СÄô°®Ñ§Ï° 2026-04-14 8/400 2026-04-16 07:22 by ѧԱJpLReM
[¿¼ÑÐ] ҩѧÇóµ÷¼Á +11 RussHu 2026-04-12 13/650 2026-04-15 19:07 by zhuwenxu
[¿¼ÑÐ] 297¹¤¿Æµ÷¼Á? +14 ºÓÄÏũҵ´óѧ-ÄÜ 2026-04-13 15/750 2026-04-15 13:25 by ºÚ¿Æ¼¼¿óÒµ
[¿¼ÑÐ] ¸´ÊÔµ÷¼Á +21 »ý¼«ÏòÉÏ£» 2026-04-10 23/1150 2026-04-15 12:50 by Î÷±±Íû¡ª·çɳ
[¿¼ÑÐ] ²ÄÁÏרҵ344Çóµ÷¼Á +17 hualkop 2026-04-10 22/1100 2026-04-14 16:21 by sxdj2
[¿¼ÑÐ] ҩѧ305Çóµ÷¼Á +10 Â꿨°Í¿¨boom 2026-04-10 10/500 2026-04-14 15:55 by zs92450
[¿¼ÑÐ] 305Çóµ÷¼Á +8 Â꿨°Í¿¨boom 2026-04-11 8/400 2026-04-14 09:04 by pengliang8036
[¿¼ÑÐ] 332Çóµ÷¼Á +15 ½¶½¶123 2026-04-10 15/750 2026-04-13 23:12 by pies112
[¿¼ÑÐ] 293Çóµ÷¼Á +16 ÎÒ°®¸ßÊý¸ßÊý°®Î 2026-04-12 18/900 2026-04-13 21:47 by ѧԱJpLReM
[¿¼ÑÐ] Çóµ÷¼Á288 +7 ioodiiij 2026-04-10 9/450 2026-04-13 08:33 by Hayaay
[½Ìʦ֮¼Ò] ɽ¶«Ë«·ÇԺУ¿¼ºË³¬¼¶ÎÞµ×Ïߣ¬Áìµ¼ÐÒÔÖÀÖ»ö£¬½ÌʦÔâÑê¿Ö +3 qut2026 2026-04-11 7/350 2026-04-12 20:24 by qut2026
[¿¼ÑÐ] Ò»Ö¾Ô¸Î÷±±¹¤Òµ´óѧ289 085602 +33 yangæÃ 2026-04-10 34/1700 2026-04-12 08:11 by Art1977
[¿¼ÑÐ] ũҵ¹ÜÀí302·ÖÇóµ÷¼Á +3 xuening1 2026-04-10 3/150 2026-04-11 10:18 by zhq0425
[¿¼ÑÐ] ÖÐҩѧµ÷¼Á ³õÊÔ324 +4 Ñó¸Ê¾Õ¡¢ 2026-04-10 6/300 2026-04-11 09:41 by gong120082
[¿¼ÑÐ] ±¾¿Æ211 ¹¤¿Æ085400 280·ÖÇóµ÷¼Á ¿É¿çרҵ +11 LZH£¨µÈ´ýµ÷¼ÁÖÐ 2026-04-10 11/550 2026-04-11 08:39 by zhq0425
[¿¼ÑÐ] Ò»Ö¾Ô¸±±Àí¹¤298Ó¢Ò»Êý¶þÒÑÉϰ¶£¬¸Ðл¸÷λÀÏʦ +14 Reframe 2026-04-10 16/800 2026-04-10 23:07 by caotw2020
[¿¼ÑÐ] Ò»Ö¾Ô¸¾©Çø985£¬085401µç×ÓÐÅÏ¢£¬±¾¿Æµç×ÓÐÅÏ¢ +3 Ñô¹â¿ªÀʵÄÄк¢ 2026-04-10 3/150 2026-04-10 16:29 by sophia_93
[¿¼ÑÐ] »úеר368 ÓÐÈ¥´¦Âð +4 ÖÖ´óÊ÷ 2026-04-10 4/200 2026-04-10 15:31 by jiajinhpu
ÐÅÏ¢Ìáʾ
ÇëÌî´¦ÀíÒâ¼û