????c++?е???
???????????? ???????[ 2013/5/31 10:37:22 ] ????????
??????????????????a??b?麯????????vtable?????table?е?λ?????????(??????????????????vtable??????????????)?????????????????????????????????????????????????????????麯???????粻????????????麯??a??b??????Y??vtable?е?λ?ú??????X??vtable?е?λ?ò????????????????????????????????????????麯??a??b??????????????X??vtable???????????????????????е????????????????????????ò?????????????????Ч??
????????????????У??????yp?????????????c????????????????γ????????8byte???????????£?
; 32 : yp->c();
mov ecx?? DWORD PTR _yp$[ebp];??yp?????????????????ecx
mov edx?? DWORD PTR [ecx];??????????????????edx??????????vptr????vtable??????edx
mov ecx?? DWORD PTR _yp$[ebp];??yp????????????????ecx??????????????????????????c
mov eax?? DWORD PTR [edx+8];?????????vtable????8byte???????????eax???????麯??c??????eax(?????麯??b???????λ?????????Y??vtable????8byte??)
call eax;????????????c
???????????
????????????????????????????????????????????????????????????????????????????????е??????г??????????????????
??????????c++???
class X {
private:
int i;
public:
virtual void a() {
i = 1;
}
virtual void b() {
i = 2;
}
};
class Y : public X {
private:
int i;
public:
virtual void c() {//???????麯??
i = 3;
}
void b() {//??д?????е??麯??
i = 4;
}
};
void f(X x) {//????????????????????
x.b();
}
int main() {
Y y;
f(y);
}
??????????main??????????
; 28 : int main() {
push ebp
mov ebp?? esp
sub esp?? 16 ; ?????y???16byte????
; 29 : Y y;
lea ecx?? DWORD PTR _y$[ebp];??y????????ecx?????????????????y???????
call ??0Y@@QAE@XZ;????y???????
; 30 : f(y);
sub esp?? 8;//??????????????п???????????????????????????????8byte????(??X???С)
mov ecx?? esp;//????????????????ecx??????????????????????????
lea eax?? DWORD PTR _y$[ebp];??????y????????eax???????????????????
push eax;???????????
call 0X@@QAE@ABV0@@Z;??????X?????????
call f@@YAXVX@@@Z ; ???ú???f
add esp?? 8;?????????????????8byte???
; 31 : }
xor eax?? eax
mov esp?? ebp
pop ebp
ret 0
???????????п?????????????????С?????X???С????????????????????X???????????
?????????????X??????????????
??0X@@QAE@ABV0@@Z PROC ; X::X?? COMDAT
; _this$ = ecx
push ebp
mov ebp?? esp
push ecx;?????????????????4byte???
mov DWORD PTR _this$[ebp]?? ecx;ecx?б????????????????????????????
mov eax?? DWORD PTR _this$[ebp];???????????????ecx
mov DWORD PTR [eax]?? OFFSET ??_7X@@6B@;????X??vtable?????浽???????????????????? ???????????????vptr???
mov ecx?? DWORD PTR _this$[ebp];????????????????ecx
mov edx?? DWORD PTR ___that$[ebp];??y????????edx
mov eax?? DWORD PTR [edx+4];?????y????4byte??????????edx??????y????????????е???????i?????edx
mov DWORD PTR [ecx+4]?? eax;??eax???????????????????4byte????棬????eax???????????????????i
mov eax?? DWORD PTR _this$[ebp];????????????????eax????????????????????????????????
mov esp?? ebp
pop ebp
ret 4
????????????????????????????????????y???????????????????y??????????????????????vptr????????????X??vtable??????
?????????????f??????
; 24 : void f(X x) {
push ebp
mov ebp?? esp
; 25 : x.b();
lea ecx?? DWORD PTR _x$[ebp];??????x????????ecx?????????????????????????b
call ?b@X@@UAEXXZ ; ????x?е???????b ???????????????????????з???vtable
????????????????X???????????????????з??????vtable
????????????X?????????????b??????
?b@X@@UAEXXZ PROC ; X::b?? COMDAT
; _this$ = ecx
; 8 : virtual void b() {
push ebp
mov ebp?? esp
push ecx;???????????????4byte???
mov DWORD PTR _this$[ebp]?? ecx;ecx?б????ж???x????????????????????
; 9 : i = 2;
mov eax?? DWORD PTR _this$[ebp];??x??????eax
mov DWORD PTR [eax+4]?? 2;??2д?????x????4byte????????2????x????????i
; 10 : }
mov esp?? ebp
pop ebp
ret 0
?b@X@@UAEXXZ ENDP
??????
???·???
??????????????????
2023/3/23 14:23:39???д?ò??????????
2023/3/22 16:17:39????????????????????Щ??
2022/6/14 16:14:27??????????????????????????
2021/10/18 15:37:44???????????????
2021/9/17 15:19:29???·???????·
2021/9/14 15:42:25?????????????
2021/5/28 17:25:47??????APP??????????
2021/5/8 17:01:11