类继承
1 #include <stdio.h> 2 3 class CSofa 4 { 5 public: 6 CSofa() 7 { 8 m_nColor = 2; 9 } 10 11 virtual ~CSofa() 12 { 13 printf("virtual ~CSofa() \r\n"); 14 } 15 16 virtual int GetColor() 17 { 18 return m_nColor; 19 } 20 21 virtual int SitDown() 22 { 23 return printf("Sit down and rest your legs \r\n"); 24 } 25 26 protected: 27 int m_nColor; 28 }; 29 30 class CBed 31 { 32 public: 33 CBed() 34 { 35 m_nLength = 4; 36 m_nWidth = 5; 37 } 38 39 virtual ~CBed() 40 { 41 printf("virtual ~CBed() \r\n"); 42 } 43 44 virtual int GetArea() 45 { 46 return m_nLength * m_nWidth; 47 } 48 49 virtual int Sleep() 50 { 51 return printf("go to sleep \r\n"); 52 } 53 54 protected: 55 int m_nLength; 56 int m_nWidth; 57 }; 58 59 class CSofaBed : public CSofa, public CBed 60 { 61 public: 62 CSofaBed() 63 { 64 m_nHeight = 6; 65 } 66 67 virtual ~CSofaBed() 68 { 69 printf("virtual ~CSofaBed() \r\n"); 70 } 71 72 virtual int SitDown() 73 { 74 return printf("Sit down on the sofa bed \r\n"); 75 } 76 77 virtual int Sleep() 78 { 79 return printf("go to sleep on the sofa bed \r\n"); 80 } 81 82 virtual int GetHeight() 83 { 84 return m_nHeight; 85 } 86 87 protected: 88 int m_nHeight; 89 }; 90 91 92 int main(void) 93 { 94 95 CSofaBed first; 96 return 0; 97 }
重点关注下构造函数,析构函数的调用,虚表指针的赋值,虚表的构成
1 08048f40 <main>: 2 8048f40: 55 push %ebp 3 8048f41: 89 e5 mov %esp,%ebp 4 8048f43: 53 push %ebx 5 8048f44: 83 e4 f0 and $0xfffffff0,%esp 6 8048f47: 83 ec 30 sub $0x30,%esp 7 8048f4a: 8d 44 24 18 lea 0x18(%esp),%eax 8 8048f4e: 89 04 24 mov %eax,(%esp) 9 8048f51: e8 3e 01 00 00 call 8049094 <_ZN8CSofaBedC1Ev> CSofaBed::CSofaBed() 10 8048f56: bb 00 00 00 00 mov $0x0,%ebx 11 8048f5b: 8d 44 24 18 lea 0x18(%esp),%eax 12 8048f5f: 89 04 24 mov %eax,(%esp) 13 8048f62: e8 75 01 00 00 call 80490dc <_ZN8CSofaBedD1Ev> CSofaBed::~CSofaBed() 14 8048f67: 89 d8 mov %ebx,%eax 15 8048f69: 8b 5d fc mov -0x4(%ebp),%ebx 16 8048f6c: c9 leave 17 8048f6d: c3 ret 18 19 08048f6e <_ZN5CSofaC1Ev>: CSofa::CSofa() 20 8048f6e: 55 push %ebp 21 8048f6f: 89 e5 mov %esp,%ebp 22 8048f71: 8b 45 08 mov 0x8(%ebp),%eax 23 8048f74: c7 00 18 f9 0c 08 movl $0x80cf918,(%eax) vtable for CSofa 24 8048f7a: 8b 45 08 mov 0x8(%ebp),%eax 25 8048f7d: c7 40 04 02 00 00 00 movl $0x2,0x4(%eax) 26 8048f84: 5d pop %ebp 27 8048f85: c3 ret 28 29 08048f86 <_ZN5CSofaD1Ev>: CSofa::~CSofa() 30 8048f86: 55 push %ebp 31 8048f87: 89 e5 mov %esp,%ebp 32 8048f89: 83 ec 18 sub $0x18,%esp 33 8048f8c: 8b 45 08 mov 0x8(%ebp),%eax 34 8048f8f: c7 00 18 f9 0c 08 movl $0x80cf918,(%eax) 35 8048f95: c7 04 24 08 f8 0c 08 movl $0x80cf808,(%esp) 36 8048f9c: e8 af ef 00 00 call 8057f50 <_IO_puts> 37 8048fa1: b8 00 00 00 00 mov $0x0,%eax 38 8048fa6: 83 e0 01 and $0x1,%eax 39 8048fa9: 84 c0 test %al,%al 40 8048fab: 74 0b je 8048fb8 <_ZN5CSofaD1Ev+0x32> 41 8048fad: 8b 45 08 mov 0x8(%ebp),%eax 42 8048fb0: 89 04 24 mov %eax,(%esp) 43 8048fb3: e8 f8 07 00 00 call 80497b0 <_ZdlPv> 44 8048fb8: c9 leave 45 8048fb9: c3 ret 46 47 08048fba <_ZN5CSofaD0Ev>: CSofa::~CSofa() 48 8048fba: 55 push %ebp 49 8048fbb: 89 e5 mov %esp,%ebp 50 8048fbd: 83 ec 18 sub $0x18,%esp 51 8048fc0: 8b 45 08 mov 0x8(%ebp),%eax 52 8048fc3: 89 04 24 mov %eax,(%esp) 53 8048fc6: e8 bb ff ff ff call 8048f86 <_ZN5CSofaD1Ev> 54 8048fcb: 8b 45 08 mov 0x8(%ebp),%eax 55 8048fce: 89 04 24 mov %eax,(%esp) 56 8048fd1: e8 da 07 00 00 call 80497b0 <_ZdlPv> 57 8048fd6: c9 leave 58 8048fd7: c3 ret 59 60 08048fd8 <_ZN5CSofa8GetColorEv>: CSofa::GetColor() 61 8048fd8: 55 push %ebp 62 8048fd9: 89 e5 mov %esp,%ebp 63 8048fdb: 8b 45 08 mov 0x8(%ebp),%eax 64 8048fde: 8b 40 04 mov 0x4(%eax),%eax 65 8048fe1: 5d pop %ebp 66 8048fe2: c3 ret 67 8048fe3: 90 nop 68 69 08048fe4 <_ZN5CSofa7SitDownEv>: CSofa::SitDown() 70 8048fe4: 55 push %ebp 71 8048fe5: 89 e5 mov %esp,%ebp 72 8048fe7: 83 ec 18 sub $0x18,%esp 73 8048fea: c7 04 24 1c f8 0c 08 movl $0x80cf81c,(%esp) 74 8048ff1: e8 8a ec 00 00 call 8057c80 <_IO_printf> 75 8048ff6: c9 leave 76 8048ff7: c3 ret 77 78 08048ff8 <_ZN4CBedC1Ev>: CBed::CBed() 79 8048ff8: 55 push %ebp 80 8048ff9: 89 e5 mov %esp,%ebp 81 8048ffb: 8b 45 08 mov 0x8(%ebp),%eax 82 8048ffe: c7 00 00 f9 0c 08 movl $0x80cf900,(%eax) vtable for CBed 83 8049004: 8b 45 08 mov 0x8(%ebp),%eax 84 8049007: c7 40 04 04 00 00 00 movl $0x4,0x4(%eax) 85 804900e: 8b 45 08 mov 0x8(%ebp),%eax 86 8049011: c7 40 08 05 00 00 00 movl $0x5,0x8(%eax) 87 8049018: 5d pop %ebp 88 8049019: c3 ret 89 90 0804901a <_ZN4CBedD1Ev>: CBed::~CBed() 91 804901a: 55 push %ebp 92 804901b: 89 e5 mov %esp,%ebp 93 804901d: 83 ec 18 sub $0x18,%esp 94 8049020: 8b 45 08 mov 0x8(%ebp),%eax 95 8049023: c7 00 00 f9 0c 08 movl $0x80cf900,(%eax) 96 8049029: c7 04 24 3b f8 0c 08 movl $0x80cf83b,(%esp) 97 8049030: e8 1b ef 00 00 call 8057f50 <_IO_puts> 98 8049035: b8 00 00 00 00 mov $0x0,%eax 99 804903a: 83 e0 01 and $0x1,%eax 100 804903d: 84 c0 test %al,%al 101 804903f: 74 0b je 804904c <_ZN4CBedD1Ev+0x32> CBed::~CBed() + 0x32 102 8049041: 8b 45 08 mov 0x8(%ebp),%eax 103 8049044: 89 04 24 mov %eax,(%esp) 104 8049047: e8 64 07 00 00 call 80497b0 <_ZdlPv> 105 804904c: c9 leave 106 804904d: c3 ret 107 108 0804904e <_ZN4CBedD0Ev>: CBed::~CBed() 109 804904e: 55 push %ebp 110 804904f: 89 e5 mov %esp,%ebp 111 8049051: 83 ec 18 sub $0x18,%esp 112 8049054: 8b 45 08 mov 0x8(%ebp),%eax 113 8049057: 89 04 24 mov %eax,(%esp) 114 804905a: e8 bb ff ff ff call 804901a <_ZN4CBedD1Ev> 115 804905f: 8b 45 08 mov 0x8(%ebp),%eax 116 8049062: 89 04 24 mov %eax,(%esp) 117 8049065: e8 46 07 00 00 call 80497b0 <_ZdlPv> 118 804906a: c9 leave 119 804906b: c3 ret 120 121 0804906c <_ZN4CBed7GetAreaEv>: CBed::GetArea() 122 804906c: 55 push %ebp 123 804906d: 89 e5 mov %esp,%ebp 124 804906f: 8b 45 08 mov 0x8(%ebp),%eax 125 8049072: 8b 50 04 mov 0x4(%eax),%edx 126 8049075: 8b 45 08 mov 0x8(%ebp),%eax 127 8049078: 8b 40 08 mov 0x8(%eax),%eax 128 804907b: 0f af c2 imul %edx,%eax 129 804907e: 5d pop %ebp 130 804907f: c3 ret 131 132 08049080 <_ZN4CBed5SleepEv>: CBed::Sleep() 133 8049080: 55 push %ebp 134 8049081: 89 e5 mov %esp,%ebp 135 8049083: 83 ec 18 sub $0x18,%esp 136 8049086: c7 04 24 4d f8 0c 08 movl $0x80cf84d,(%esp) 137 804908d: e8 ee eb 00 00 call 8057c80 <_IO_printf> 138 8049092: c9 leave 139 8049093: c3 ret 140 141 08049094 <_ZN8CSofaBedC1Ev>: CSofaBed::CSofaBed() 142 8049094: 55 push %ebp 143 8049095: 89 e5 mov %esp,%ebp 144 8049097: 83 ec 18 sub $0x18,%esp 145 804909a: 8b 45 08 mov 0x8(%ebp),%eax 146 804909d: 89 04 24 mov %eax,(%esp) 147 80490a0: e8 c9 fe ff ff call 8048f6e <_ZN5CSofaC1Ev> CSofa::CSofa() 148 80490a5: 8b 45 08 mov 0x8(%ebp),%eax 149 80490a8: 83 c0 08 add $0x8,%eax 150 80490ab: 89 04 24 mov %eax,(%esp) 151 80490ae: e8 45 ff ff ff call 8048ff8 <_ZN4CBedC1Ev> CBed::CBed() 152 80490b3: 8b 45 08 mov 0x8(%ebp),%eax 153 80490b6: c7 00 c8 f8 0c 08 movl $0x80cf8c8,(%eax) vtable for CSofaBed 154 80490bc: 8b 45 08 mov 0x8(%ebp),%eax 155 80490bf: c7 40 08 e8 f8 0c 08 movl $0x80cf8e8,0x8(%eax) 156 80490c6: 8b 45 08 mov 0x8(%ebp),%eax 157 80490c9: c7 40 14 06 00 00 00 movl $0x6,0x14(%eax) 158 80490d0: c9 leave 159 80490d1: c3 ret 160 161 080490d2 <_ZThn8_N8CSofaBedD1Ev>: non-virtual thunk to CSofaBed::~CSofaBed() 162 80490d2: 83 6c 24 04 08 subl $0x8,0x4(%esp) 163 80490d7: e9 00 00 00 00 jmp 80490dc <_ZN8CSofaBedD1Ev> 164 165 080490dc <_ZN8CSofaBedD1Ev>: CSofaBed::~CSofaBed() 166 80490dc: 55 push %ebp 167 80490dd: 89 e5 mov %esp,%ebp 168 80490df: 53 push %ebx 169 80490e0: 83 ec 14 sub $0x14,%esp 170 80490e3: 8b 45 08 mov 0x8(%ebp),%eax 171 80490e6: c7 00 c8 f8 0c 08 movl $0x80cf8c8,(%eax) 172 80490ec: 8b 45 08 mov 0x8(%ebp),%eax 173 80490ef: c7 40 08 e8 f8 0c 08 movl $0x80cf8e8,0x8(%eax) 174 80490f6: c7 04 24 5c f8 0c 08 movl $0x80cf85c,(%esp) 175 80490fd: e8 4e ee 00 00 call 8057f50 <_IO_puts> 176 8049102: 8b 45 08 mov 0x8(%ebp),%eax 177 8049105: 83 c0 08 add $0x8,%eax 178 8049108: 89 04 24 mov %eax,(%esp) 179 804910b: e8 0a ff ff ff call 804901a <_ZN4CBedD1Ev> CBed::~CBed() 180 8049110: 8b 45 08 mov 0x8(%ebp),%eax 181 8049113: 89 04 24 mov %eax,(%esp) 182 8049116: e8 6b fe ff ff call 8048f86 <_ZN5CSofaD1Ev> 183 804911b: b8 00 00 00 00 mov $0x0,%eax 184 8049120: 83 e0 01 and $0x1,%eax 185 8049123: 84 c0 test %al,%al 186 8049125: 74 36 je 804915d <_ZN8CSofaBedD1Ev+0x81> 187 8049127: 8b 45 08 mov 0x8(%ebp),%eax 188 804912a: 89 04 24 mov %eax,(%esp) 189 804912d: e8 7e 06 00 00 call 80497b0 <_ZdlPv> 190 8049132: eb 29 jmp 804915d <_ZN8CSofaBedD1Ev+0x81> 191 8049134: 89 c3 mov %eax,%ebx 192 8049136: 8b 45 08 mov 0x8(%ebp),%eax 193 8049139: 83 c0 08 add $0x8,%eax 194 804913c: 89 04 24 mov %eax,(%esp) 195 804913f: e8 d6 fe ff ff call 804901a <_ZN4CBedD1Ev> 196 8049144: eb 02 jmp 8049148 <_ZN8CSofaBedD1Ev+0x6c> CSofaBed::~CSofaBed() 197 8049146: 89 c3 mov %eax,%ebx 198 8049148: 8b 45 08 mov 0x8(%ebp),%eax 199 804914b: 89 04 24 mov %eax,(%esp) 200 804914e: e8 33 fe ff ff call 8048f86 <_ZN5CSofaD1Ev> CSofa::~CSofa() 201 202 8049153: 89 d8 mov %ebx,%eax 203 8049155: 89 04 24 mov %eax,(%esp) 204 8049158: e8 b3 bf 00 00 call 8055110 <_Unwind_Resume> 205 804915d: 83 c4 14 add $0x14,%esp 206 8049160: 5b pop %ebx 207 8049161: 5d pop %ebp 208 8049162: c3 ret 209 8049163: 90 nop 210 211 08049164 <_ZThn8_N8CSofaBedD0Ev>: non-virtual thunk to CSofaBed::~CSofaBed() 212 8049164: 83 6c 24 04 08 subl $0x8,0x4(%esp) 213 8049169: eb 01 jmp 804916c <_ZN8CSofaBedD0Ev> 214 804916b: 90 nop 215 216 0804916c <_ZN8CSofaBedD0Ev>: CSofaBed::~CSofaBed() 217 804916c: 55 push %ebp 218 804916d: 89 e5 mov %esp,%ebp 219 804916f: 83 ec 18 sub $0x18,%esp 220 8049172: 8b 45 08 mov 0x8(%ebp),%eax 221 8049175: 89 04 24 mov %eax,(%esp) 222 8049178: e8 5f ff ff ff call 80490dc <_ZN8CSofaBedD1Ev> 223 804917d: 8b 45 08 mov 0x8(%ebp),%eax 224 8049180: 89 04 24 mov %eax,(%esp) 225 8049183: e8 28 06 00 00 call 80497b0 <_ZdlPv> 226 8049188: c9 leave 227 8049189: c3 ret 228 229 0804918a <_ZN8CSofaBed7SitDownEv>: CSofaBed::SitDown() 230 804918a: 55 push %ebp 231 804918b: 89 e5 mov %esp,%ebp 232 804918d: 83 ec 18 sub $0x18,%esp 233 8049190: c7 04 24 72 f8 0c 08 movl $0x80cf872,(%esp) 234 8049197: e8 e4 ea 00 00 call 8057c80 <_IO_printf> 235 804919c: c9 leave 236 804919d: c3 ret 237 238 0804919e <_ZThn8_N8CSofaBed5SleepEv>: non-virtual thunk to CSofaBed::Sleep() 239 804919e: 83 6c 24 04 08 subl $0x8,0x4(%esp) 240 80491a3: eb 01 jmp 80491a6 <_ZN8CSofaBed5SleepEv> 241 80491a5: 90 nop 242 243 080491a6 <_ZN8CSofaBed5SleepEv>: CSofaBed::Sleep() 244 80491a6: 55 push %ebp 245 80491a7: 89 e5 mov %esp,%ebp 246 80491a9: 83 ec 18 sub $0x18,%esp 247 80491ac: c7 04 24 90 f8 0c 08 movl $0x80cf890,(%esp) 248 80491b3: e8 c8 ea 00 00 call 8057c80 <_IO_printf> 249 80491b8: c9 leave 250 80491b9: c3 ret 251 252 080491ba <_ZN8CSofaBed9GetHeightEv>: CSofaBed::GetHeight() 253 80491ba: 55 push %ebp 254 80491bb: 89 e5 mov %esp,%ebp 255 80491bd: 8b 45 08 mov 0x8(%ebp),%eax 256 80491c0: 8b 40 14 mov 0x14(%eax),%eax 257 80491c3: 5d pop %ebp 258 80491c4: c3 ret 259 80491c5: 90 nop 260 80491c6: 90 nop 261 80491c7: 90 nop 262 80491c8: 90 nop 263 80491c9: 90 nop 264 80491ca: 90 nop 265 80491cb: 90 nop 266 80491cc: 90 nop 267 80491cd: 90 nop 268 80491ce: 90 nop 269 80491cf: 90 nop 270 271 272 080cf8c0 <_ZTV8CSofaBed>: vtable for CSofaBed 273 80cf8c0: 00 00 00 00 274 80cf8c4: 40 f9 0c 08 typeinfo for CSofaBed 275 80cf8c8: dc 90 04 08 CSofaBed::~CSofaBed() 276 80cf8cc: 6c 91 04 08 CSofaBed::~CSofaBed() 277 80cf8d0: d8 8f 04 08 CSofa::GetColor() 278 80cf8d4: 8a 91 04 08 CSofaBed::SitDown() 279 80cf8d8: a6 91 04 08 CSofaBed::Sleep() 280 80cf8dc: ba 91 04 08 CSofaBed::GetHeight() 281 80cf8e0: f8 ff ff ff 282 80cf8e4: 40 f9 0c 08 typeinfo for CSofaBed 283 80cf8e8: d2 90 04 08 non-virtual thunk to CSofaBed::~CSofaBed() 284 80cf8ec: 64 91 04 08 non-virtual thunk to CSofaBed::~CSofaBed() 285 80cf8f0: 6c 90 04 08 CBed::GetArea() 286 80cf8f6: 9e 91 04 08 non-virtual thunk to CSofaBed::Sleep() 287 288 080cf8f8 <_ZTV4CBed>: vtable for CBed 289 80cf8f8: 00 00 00 00 290 80cf8fc: 68 f9 0c 08 typeinfo for CBed 291 80cf900: 1a 90 04 08 CBed::~CBed() 292 80cf904: 4e 90 04 08 CBed::~CBed() 293 80cf908: 6c 90 04 08 CBed::GetArea() 294 80cf90c: 80 90 04 08 CBed::Sleep() 295 296 080cf910 <_ZTV5CSofa>: vtable for CSofa 297 80cf910: 00 00 00 00 298 80cf916: 78 f9 0c 08 typeinfo for CSofa 299 80cf918: 86 8f 04 08 CSofa::~CSofa() 300 80cf91c: ba 8f 04 08 CSofa::~CSofa() 301 80cf920: d8 8f 04 08 CSofa::GetColor() 302 80cf926: e4 8f 04 08 CSofa::SitDown() 303 304 080cf928 <_ZTS8CSofaBed>: typeinfo name for CSofaBed 305 80cf928: 38 43 53 cmp %al,0x53(%ebx) 306 80cf92b: 6f outsl %ds:(%esi),(%dx) 307 80cf92c: 66 61 popaw 308 80cf92e: 42 inc %edx 309 80cf92f: 65 64 00 00 gs add %al,%fs:%gs:(%eax) 310 ... 311 312 080cf940 <_ZTI8CSofaBed>: typeinfo for CSofaBed 313 80cf940: 68 ae 0f 08 28 push $0x28080fae 314 80cf945: f9 stc 315 80cf946: 0c 08 or $0x8,%al 316 80cf948: 00 00 add %al,(%eax) 317 80cf94a: 00 00 add %al,(%eax) 318 80cf94c: 02 00 add (%eax),%al 319 80cf94e: 00 00 add %al,(%eax) 320 80cf950: 78 f9 js 80cf94b <_ZTI8CSofaBed+0xb> 321 80cf952: 0c 08 or $0x8,%al 322 80cf954: 02 00 add (%eax),%al 323 80cf956: 00 00 add %al,(%eax) 324 80cf958: 68 f9 0c 08 02 push $0x2080cf9 325 80cf95d: 08 00 or %al,(%eax) 326 ... 327 328 080cf960 <_ZTS4CBed>: typeinfo name for CBed 329 80cf960: 34 43 xor $0x43,%al 330 80cf962: 42 inc %edx 331 80cf963: 65 64 00 00 gs add %al,%fs:%gs:(%eax) 332 ... 333 334 080cf968 <_ZTI4CBed>: typeinfo for CBed 335 80cf968: a8 ad test $0xad,%al 336 80cf96a: 0f 08 invd 337 80cf96c: 60 pusha 338 80cf96d: f9 stc 339 80cf96e: 0c 08 or $0x8,%al 340 341 080cf970 <_ZTS5CSofa>: typeinfo name for CSofa 342 80cf970: 35 43 53 6f 66 xor $0x666f5343,%eax 343 80cf975: 61 popa 344 ... 345 346 080cf978 <_ZTI5CSofa>: typeinfo for CSofa 347 80cf978: a8 ad test $0xad,%al 348 80cf97a: 0f 08 invd 349 80cf97c: 70 f9 jo 80cf977 <_ZTS5CSofa+0x7> 350 80cf97e: 0c 08 or $0x8,%al