??????????????????Σ?????????????κ??麯???????μ?С?

??????????c++???

class Top {//?????
public:
    int i;
    Top(int ii) {
        i = ii;
    }
};

class Left : public virtual Top {
public:
    int j;
    Left(int jj?? int ii) : Top(ii) {
        j = jj;
    }
};

class Right : public virtual Top {
public:
    int k;
    Right(int kk?? int ii) : Top(ii) {
        k = kk;
    }
};

class Bottom : public Left?? public Right {
public:
    int l;
    Bottom(int ll?? int jj?? int kk?? int ii) : Top(ii)?? Left(jj?? ii)?? Right(kk?? ii) {
        l = ll;
    }
};

int main() {
    Bottom b(1?? 2?? 3?? 4);
    Bottom* bp = &b;
    //??????????????
    b.l = 1;
    bp->l = 2;
    //???????Left????????
    Left* lp = bp;
    b.j = 1;
    bp->j = 2;
    lp->j = 3;
    //???????Right????????
    Right* rp = bp;
    b.k = 1;
    bp->k = 2;
    rp->k = 3;
    //?????????Top????????
    Top* tp = bp;
    b.i = 1;
    bp->i = 2;
    tp->i = 3;
  
};

???????????????????????????????????????Σ????main?????????????

; 33   : int main() {

    push    ebp
    mov    ebp?? esp
    sub    esp?? 48                    ; ???????????????????????ж???b??24byte

; 34   :     Bottom b(1?? 2?? 3?? 4);

    push    1;?????1??????ж?????????????????????? 1????????0?????????
    push    4;??4???????b??????????????
    push    3;??3???????b??????????????
    push    2;??2???????b??????????????
    push    1;??1???????b??????????????
    lea    ecx?? DWORD PTR _b$[ebp];???????b?????????????????ecx??????????????????????b???????
    call    ??0Bottom@@QAE@HHHH@Z            ; ???????b???????

; 35   :     Bottom* bp = &b;

    lea    eax?? DWORD PTR _b$[ebp];??????b?????????????eax
    mov    DWORD PTR _bp$[ebp]?? eax;??????b??????????????bp

; 36   :   
; 37   :     b.l = 1;

    mov    DWORD PTR _b$[ebp+16]?? 1;??1д????????????16??????棬???????b????????l???1

; 38   :     bp->l = 2;

    mov    ecx?? DWORD PTR _bp$[ebp];??????b?????????????ecx
    mov    DWORD PTR [ecx+16]?? 2;??2д????????????16??????棬???????b????????l???2
                             ;???????????????????????????????????????b????????
                             ;??????????????????????????????16???
                             ;??????????????в??

; 39   :   
; 40   :     Left* lp = bp;

    mov    edx?? DWORD PTR _bp$[ebp];??????b?????????????edx
    mov    DWORD PTR _lp$[ebp]?? edx;??????b???????????????lp?????lp???????Left??????
                                ;?????????沼??????????????????Left????????Bottom???

; 41   :     b.j = 1;

    mov    DWORD PTR _b$[ebp+4]?? 1;??1??????????b????4byte????棬???
                               ;?????????????j???1

; 42   :     bp->j = 2;

    mov    eax?? DWORD PTR _bp$[ebp];??????b?????????????eax
    mov    DWORD PTR [eax+4]?? 2;??2д????????b????4byte????棬????????????????j???2
                            ;????????????????b?????????????????????????????j??
                            ;?????????????????????????????????4byte
                            ;????????????????

; 43   :     lp->j = 3;

    mov    ecx?? DWORD PTR _lp$[ebp];??????Left????????????????ecx
    mov    DWORD PTR [ecx+4]?? 3;??3???????Left????????4byte????棬?????????Left????????j???3
                            ;??????????????????????????Left????????????????????????????
                            ;?4byte

; 44   :   
; 45   :     Right* rp = bp;

    cmp    DWORD PTR _bp$[ebp]?? 0;????????????0??????ж?bp?????????
    je    SHORT $LN3@main????У??????????У?????????????
    mov    edx?? DWORD PTR _bp$[ebp];??????b?????????????edx
    add    edx?? 8;?????edx??????????8??????edx???汣?????????????b??????8byte????????????Right??????
    mov    DWORD PTR tv90[ebp]?? edx;???????edx??????????????tv90
    jmp    SHORT $LN4@main;????????$LN4@main?????
$LN3@main:
    mov    DWORD PTR tv90[ebp]?? 0;?????????tv90????????????????????ж?bp??????????????У?????????????
$LN4@main:
    mov    eax?? DWORD PTR tv90[ebp];?????????tv90???????????????eax??eax?????????Right??????
    mov    DWORD PTR _rp$[ebp]?? eax;???????eax?????????????rp
                                ;???????????????bp?????rp?????????????????ж?bp????????ж?
                                ;???????rp????????????bp??????????8byte????????????????ж?????bp??????
                                ;??bp??????κζ??????rp???????????棬?????????Σ???????????????????????

; 46   :     b.k = 1;

    mov    DWORD PTR _b$[ebp+12]?? 1;??1д????????b????12byte????????1?????????????????k

; 47   :     bp->k = 2;

    mov    ecx?? DWORD PTR _bp$[ebp];??????b???????????ecx
    mov    DWORD PTR [ecx+12]?? 2;??2д????????b????12byte????????2?????????????????k
                             ;??????????????????????????????????????????2byte
                             ;??????????????в??

; 48   :     rp->k = 3;

    mov    edx?? DWORD PTR _rp$[ebp];????????Right???????????edx
    mov    DWORD PTR [edx+4]?? 3;??3д??????????Right????4byte????????3???????????k

; 49   :   
; 50   :     Top* tp = bp;

    cmp    DWORD PTR _bp$[ebp]?? 0;???bp?????????0??????ж?bp?????????????
    jne    SHORT $LN5@main;??????????????????$LN5@main??У??????????У?????????????????
    mov    DWORD PTR tv145[ebp]?? 0;???bp????????0???????????tv145??????????????
    jmp    SHORT $LN6@main;?????????$LN6@main???
$LN5@main:
    mov    eax?? DWORD PTR _bp$[ebp];??????b?????????????eax
    mov    ecx?? DWORD PTR [eax];??????b???????????????????ecx??????b???????????vtable??????????vtable???????????
    mov    edx?? DWORD PTR _bp$[ebp];??????b?????????????edx
    add    edx?? DWORD PTR [ecx+4];ecx???????vtable????????????????vtable????4byte?????????(??????b???????????Left??????????????????????)?? ?????????b??????
                              ;???????????Top??????
    mov    DWORD PTR tv145[ebp]?? edx;?????edx???汣??????????Top???????????浽???????tv145????
$LN6@main:
    mov    eax?? DWORD PTR tv145[ebp];?????????tv145?????????????eax
    mov    DWORD PTR _tp$[ebp]?? eax;?????eax???溬??????????Top???????????tp
                                ;?????????????bp??tp?????

; 51   :     b.i = 1;

    mov    ecx?? DWORD PTR _b$[ebp];??????b??????????????????ecx??ecx??????vtable??????
    mov    edx?? DWORD PTR [ecx+4];????vtable????4byte???????????????b???????????Top????????????????edx
    mov    DWORD PTR _b$[ebp+edx]?? 1;??????????????edx????????????????????Top????????1д?????????????棬ji
                                 ;??????????????????i???

; 52   :     bp->i = 2;

    mov    eax?? DWORD PTR _bp$[ebp];??????b?????????????eax
    mov    ecx?? DWORD PTR [eax];??????b????????????????ecx??????vtable?????????????ecx
    mov    edx?? DWORD PTR [ecx+4];?????vtable????4byte???????????????edx??????????b???????????Top???????????edx
    mov    eax?? DWORD PTR _bp$[ebp];??????b???????????eax
    mov    DWORD PTR [eax+edx]?? 2;??????b??????????????????????????????Top??????????2д???????????洦??
                              ;????????????????????i???2

; 53   :     tp->i = 3;

    mov    ecx?? DWORD PTR _tp$[ebp];??????????Top?????????????ecx
    mov    DWORD PTR [ecx]?? 3;??3????????????Top??????????????????????i???

; 54   :   
; 55   : };

    xor    eax?? eax
    mov    esp?? ebp
    pop    ebp
    ret    0
_main    ENDP