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