??????????????????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