????????????????????????????????У???????????????????????????????????????????????????????????а?????????????????????????????????????????????????????????????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();