²é¿´: 161  |  »Ø¸´: 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 µÄÖ÷Ìâ¸üÐÂ
×î¾ßÈËÆøÈÈÌûÍÆ¼ö [²é¿´È«²¿] ×÷Õß »Ø/¿´ ×îºó·¢±í
[¿¼ÑÐ] ²ÄÁÏ284Çóµ÷¼Á£¬Ò»Ö¾Ô¸Ö£ÖÝ´óѧӢһÊý¶þר˶ +12 ÏëÉϰ¶µÄÍÁ²¦Êó 2026-02-28 12/600 2026-03-02 16:18 by youmomaoyan
[¿¼ÑÐ] 303Çóµ÷¼Á +5 ½ñÏIJ»ÏÄ 2026-03-01 5/250 2026-03-02 15:01 by ÏòÉϵÄÅÖ¶«
[¿¼ÑÐ] 290·Ö²ÄÁϹ¤³Ì085601Çóµ÷¼Á Êý¶þÓ¢Ò» +3 llx0610 2026-03-02 3/150 2026-03-02 14:15 by yc258
[¿¼ÑÐ] 291 Çóµ÷¼Á +3 »¯¹¤2026½ì±ÏÒµÉ 2026-03-02 3/150 2026-03-02 12:55 by houyaoxu
[¿¼ÑÐ] 26¿¼Ñб¨¿¼Î÷¹¤´ó²ÄÁÏ308·ÖÇóµ÷¼Á +4 weizhong123 2026-03-01 4/200 2026-03-02 12:46 by Î޼ʵIJÝÔ­
[¿¼ÑÐ] 268Çóµ÷¼Á +4 ¼òµ¥µã0 2026-03-02 5/250 2026-03-02 11:54 by ms629
[¿¼ÑÐ] 274Çóµ÷¼Á +3 cgyzqwn 2026-03-01 7/350 2026-03-02 10:38 by lature00
[¿¼ÑÐ] 322Çóµ÷¼Á +3 Ðܾ³†´ 2026-03-01 3/150 2026-03-02 08:44 by houyaoxu
[¿¼ÑÐ] ²ÄÁϸ´ÊÔµ÷¼Á +4 ѧ²ÄÁϵĵã 2026-03-01 5/250 2026-03-02 08:26 by houyaoxu
[¿¼ÑÐ] ¸ß·Ö×Ó»¯Ñ§ÓëÎïÀíµ÷¼Á +6 ºÃºÃºÃ1233 2026-02-28 13/650 2026-03-02 07:27 by ºÃºÃºÃ1233
[¿¼ÑÐ] 298Çóµ÷¼Á +6 axyz3 2026-02-28 6/300 2026-03-01 19:00 by 18137688336
[¿¼ÑÐ] 0856²ÄÁÏÇóµ÷¼Á +11 hyf hyf hyf 2026-02-28 12/600 2026-03-01 18:57 by 18137688336
[¿¼ÑÐ] 321Çóµ÷¼ÁÒ»Ö¾Ô¸¶«±±ÁÖÒµ´óѧ²ÄÁÏÓ뻯¹¤Ó¢¶þÊý¶þ +4 ³æ³æ³æ³æ³æ7 2026-03-01 7/350 2026-03-01 16:52 by caszguilin
[¿¼ÑÐ] 0856²ÄÁÏÇóµ÷¼Á +4 ÂéÀ±öÏÓã 2026-02-28 4/200 2026-03-01 16:51 by caszguilin
[¿¼ÑÐ] 304Çóµ÷¼Á +6 ÂüÊâ2266 2026-02-28 7/350 2026-03-01 15:14 by wjLi2017
[¿¼ÑÐ] ¿ÎÌâ×é½ÓÊÕ²ÄÁÏÀàµ÷¼ÁÑо¿Éú +3 gaoxiaoniuma 2026-02-28 4/200 2026-03-01 14:30 by jjjÈý¿ç
[¿¼ÑÐ] 302²ÄÁϹ¤³ÌÇóµ÷¼Á +4 Doleres 2026-03-01 5/250 2026-03-01 11:52 by liqiongjy
[¿¼ÑÐ] 311Çóµ÷¼Á +9 ÄÏåÈ720 2026-02-28 10/500 2026-03-01 10:55 by sunny81
[¿¼ÑÐ] 304Çóµ÷¼Á +3 52hz~~ 2026-02-28 5/250 2026-03-01 00:00 by 52hz~~
[¸ß·Ö×Ó] Çó»·ÑõÊ÷Ö¬Ñз¢1Ãû +3 Ëïxc 2026-02-25 11/550 2026-02-28 16:57 by ichall
ÐÅÏ¢Ìáʾ
ÇëÌî´¦ÀíÒâ¼û