菱形繼承的識別

子類的構造
CSofaBed SofaBed;
0041478E 6A 01                push        1                 ;構造祖父類的標誌 true表示構造  
00414790 8D 4D C8             lea         ecx,[SofaBed]  
00414793 E8 1F D0 FE FF       call        CSofaBed::CSofaBed (04017B7h) 

CSofaBed::CSofaBed:
004017B7 E9 C4 C9 00 00       jmp         CSofaBed::CSofaBed (040E180h)  

class CSofaBed :  public CSofa,  public CBed{
public:
    CSofaBed(){
0040E180 55                   push        ebp  
0040E181 8B EC                mov         ebp,esp  
0040E183 6A FF                push        0FFFFFFFFh  
0040E185 68 BD 6C 49 00       push        496CBDh  
0040E18A 64 A1 00 00 00 00    mov         eax,dword ptr fs:[00000000h]  
0040E190 50                   push        eax  
0040E191 81 EC D8 00 00 00    sub         esp,0D8h  
0040E197 53                   push        ebx  
0040E198 56                   push        esi  
0040E199 57                   push        edi  
0040E19A 51                   push        ecx  
0040E19B 8D BD 1C FF FF FF    lea         edi,[ebp-0E4h]  
0040E1A1 B9 36 00 00 00       mov         ecx,36h  
0040E1A6 B8 CC CC CC CC       mov         eax,0CCCCCCCCh  
0040E1AB F3 AB                rep stos    dword ptr es:[edi]  
0040E1AD 59                   pop         ecx  
protected:
          int m_nLength;                        // 牀類成員變量
          int m_nWidth;
};

// 子類沙發牀定義,派生自CSofa、CBed類,等同與類D
class CSofaBed :  public CSofa,  public CBed{
public:
    CSofaBed(){

0040E1BF 89 4D EC             mov         dword ptr [this],ecx  
0040E1C2 C7 85 20 FF FF FF 00 00 00 00 mov         dword ptr [ebp-0E0h],0  
0040E1CC 83 7D 08 00          cmp         dword ptr [ebp+8],0   ;比較參數 防止重複構造
0040E1D0 74 35                je          CSofaBed::CSofaBed+87h (040E207h)  
0040E1D2 8B 45 EC             mov         eax,dword ptr [this]  
0040E1D5 C7 40 04 AC 8E 49 00 mov         dword ptr [eax+4],offset CSofaBed::`vbtable' (0498EACh)  
0040E1DC 8B 45 EC             mov         eax,dword ptr [this]  
0040E1DF C7 40 10 FC 8E 49 00 mov         dword ptr [eax+10h],offset CSofaBed::`vbtable' (0498EFCh)  
0040E1E6 8B 4D EC             mov         ecx,dword ptr [this]  
0040E1E9 83 C1 20             add         ecx,20h  
0040E1EC E8 93 5E FF FF       call        CFurniture::CFurniture (0404084h)  
0040E1F1 C7 45 FC 00 00 00 00 mov         dword ptr [ebp-4],0  
0040E1F8 8B 85 20 FF FF FF    mov         eax,dword ptr [ebp-0E0h]  
0040E1FE 83 C8 01             or          eax,1  
0040E201 89 85 20 FF FF FF    mov         dword ptr [ebp-0E0h],eax  
0040E207 6A 00                push        0  
0040E209 8B 4D EC             mov         ecx,dword ptr [this]  
0040E20C E8 91 31 FF FF       call        CSofa::CSofa (04013A2h)  
0040E211 C7 45 FC 01 00 00 00 mov         dword ptr [ebp-4],1  
0040E218 6A 00                push        0  
0040E21A 8B 4D EC             mov         ecx,dword ptr [this]  
0040E21D 83 C1 0C             add         ecx,0Ch  
0040E220 E8 21 47 FF FF       call        CBed::CBed (0402946h)  
0040E225 8B 45 EC             mov         eax,dword ptr [this]  
0040E228 C7 00 54 8F 49 00    mov         dword ptr [eax],offset CSofaBed::`vftable' (0498F54h)  
0040E22E 8B 45 EC             mov         eax,dword ptr [this]  
0040E231 C7 40 0C 5C 8E 49 00 mov         dword ptr [eax+0Ch],offset CSofaBed::`vftable' (0498E5Ch)  
0040E238 8B 45 EC             mov         eax,dword ptr [this]  
0040E23B 8B 48 04             mov         ecx,dword ptr [eax+4]  
0040E23E 8B 51 04             mov         edx,dword ptr [ecx+4]  
0040E241 8B 45 EC             mov         eax,dword ptr [this]  
0040E244 C7 44 10 04 EC 8E 49 00 mov         dword ptr [eax+edx+4],offset CSofaBed::`vftable' (0498EECh)  
        m_nHeight = 6;
0040E24C 8B 45 EC             mov         eax,dword ptr [this]  
        m_nHeight = 6;
0040E24F C7 40 1C 06 00 00 00 mov         dword ptr [eax+1Ch],6  
    }
0040E256 C7 45 FC FF FF FF FF mov         dword ptr [ebp-4],0FFFFFFFFh  
0040E25D 8B 45 EC             mov         eax,dword ptr [this]  
0040E260 8B 4D F4             mov         ecx,dword ptr [ebp-0Ch]  
// 菱形結構分析
// 定義傢俱類,等同於類A
class CFurniture{           
public:
    CFurniture(){
        m_nPrice = 0;
    }
    virtual ~CFurniture(){             // 傢俱類虛析構函數
        printf("virtual ~CFurniture()\r\n");
    }
    virtual int GetPrice(){             // 獲取傢俱價格
        return m_nPrice;
    };
protected:
    int m_nPrice;                       // 傢俱類成員變量
};

// 定義沙發類,繼承自CFurniture,等同與類B
class CSofa : virtual public CFurniture{        
public:
    CSofa(){
        m_nPrice = 1;
        m_nColor = 2;
    }
    virtual ~CSofa(){                  // 沙發類虛析構函數
        printf("virtual ~CSofa()\r\n");
    }
    virtual int GetColor(){             // 獲取沙發顏色 
        return m_nColor;
    }
    virtual int SitDown(){              // 沙發可以坐下休息 
        return printf("Sit down and rest your legs\r\n");
    }
protected:
    int m_nColor;                       // 沙發類成員變量 
};

// 定義牀類,繼承自CFurniture,等同與類C
class CBed : virtual public CFurniture{     
public:
          CBed(){
              m_nPrice = 3;
              m_nLength = 4;
              m_nWidth = 5;
          }
          virtual ~CBed(){                     // 牀類虛析構函數 
              printf("virtual ~CBed()\r\n");
          }
          virtual int GetArea(){                    // 獲取牀面積 
              return m_nLength * m_nWidth;
          }
          virtual int Sleep(){                      // 牀可以用來睡覺 
              return printf("go to sleep\r\n");
          }
protected:
          int m_nLength;                        // 牀類成員變量
          int m_nWidth;
};

// 子類沙發牀定義,派生自CSofa、CBed類,等同與類D
class CSofaBed :  public CSofa,  public CBed{
public:
    CSofaBed(){
        m_nHeight = 6;
    }
    virtual ~CSofaBed(){                   // 沙發牀類虛析構函數
        printf("virtual ~CSofaBed()\r\n");
    }
    virtual int SitDown(){                  // 沙發可以坐下休息 
        return printf("Sit down on the sofa bed\r\n");
    }
    virtual int Sleep(){                        // 牀可以用來睡覺 
        return printf("go to sleep on the sofa bed\r\n");
    }
    virtual int GetHeight(){
        return m_nHeight;
    }
protected:
    int m_nHeight;                          // 沙發類成員變量
};

00498F54 3F aas
00498F55 2B 40 00 sub eax,dword ptr [eax]
00498F58 9A 3E 40 00 9D 22 40 call 4022:9D00403E
00498F5F 00

00498E5C 82 2E 40 sub byte ptr [esi],40h
00498E5F 00 25 13 40 00 C4

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章