菱形继承的识别

子类的构造
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值