????c++?е???
???????????? ???????[ 2013/5/31 10:37:22 ] ????????
????????????????????????????????У???????????????????????????????????????????????????????????а?????????????????????????????????????????????????????????????vtable??????????????????????????????????????????????????????У?????????????????????????????????vptr????????????vtable??????????????????????vptr????????????vtable???????vtable?????????????????????????
???????????????????????????????????????麯??????????Ч???????????????????麯??????????????????????????á?
????c++???
class X {
private:
int i;
public:
virtual void f() {
i = 1;
}
};
class Y : public X {//Y?????X
private:
int j;
public:
virtual void f() {
j = 2;
}
};
int main() {
Y y;//??????????
Y* yp = new Y;//???????????
y.f();//???????????
yp->f();//??????????
}
class X {
private:
int i;
public:
virtual void f() {
i = 1;
}
};
class Y : public X {//Y?????X
private:
int j;
public:
virtual void f() {
j = 2;
}
};
int main() {
Y y;//??????????
Y* yp = new Y;//???????????
y.f();//???????????
yp->f();//??????????
}
?????????????????????ú???f?????????ú???f??????
??????????????ú???f??????
; 25 : y.f();
lea ecx?? DWORD PTR _y$[ebp];?????????????y????????ecx??????????????????f
call f@Y@@UAEXXZ ; ????????f
?????????????ú???f??????
; 26 : yp->f();
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 ?????????????????????????f
mov eax?? DWORD PTR [edx];edx?????vtable???????????vtable???????????eax ??????f??????eax
call eax;????eax
???????????п????????????????????????????з??????vtable??????????????????????vtable???γ?????????????????????????????????????????????????????????Ч???????????Щ?麯??????????????????
??????к?vtable
???????????и????????????????????′??????vtable??????????е??麯???????vatelbe?е?λ?????????????vtable?е????λ??????????????????????麯????????????vtable????λ?ò?????????
??????????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;
}
};
int main() {
X* xp = new X;
X* yp = new Y;
xp->a();
xp->b();
yp->a();
yp->b();
//yp->c();??????????
}
???????????????yp???????????е??麯??c????????????????????????yp??????????????????????Y??????????????????????X?????????????????????????????????????????麯??a??b???????????????????е??麯??c??
??????????????????麯??????????
; 28 : xp->a();
mov edx?? DWORD PTR _xp$[ebp];??xp????????????????edx
mov eax?? DWORD PTR [edx];?????????????????????eax??????vptr????vtable??????eax
mov ecx?? DWORD PTR _xp$[ebp];??xp????????????????ecx???????????????????????????????????
mov edx?? DWORD PTR [eax];??vtable??????????????edx???????麯??a??????edx(?????麯??a????λ?????X??vtable??????)
call edx;????????????a
; 29 : xp->b();
mov eax?? DWORD PTR _xp$[ebp];??xp???????????????eax
mov edx?? DWORD PTR [eax];??????????????????edx??????vptr????vtable??????edx
mov ecx?? DWORD PTR _xp$[ebp];??xp???????????????ecx
mov eax?? DWORD PTR [edx+4];?????vtable????4byte??????????eax???????麯??b??????eax(?????麯??b????λ????????X??vtable????4byte??)
call eax;????????????b
; 30 : yp->a();
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??????????????????????????a
mov eax?? DWORD PTR [edx];??????vtable?????????????eax???????麯??a??????eax(?????麯??a???????λ??????Y??vtable??????)
call eax;????????????a
; 31 : yp->b();
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??????????????????????????b
mov eax?? DWORD PTR [edx+4];?????????vtable????4byte???????????eax???????麯??b??????eax(?????麯??b???????λ?????????Y??vtable????4byte??)
call eax;????????????b
; 32 : //yp->c();
??????
![](/images/ad-banner/ad-banner.png)
???·???
??????????????????
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