1. 关于整个书,我觉得如果能够把各种类的sizeof搞定,就肯定OK了。所以请参看另一篇文章"sizeof大全":
http://blog.csdn.net/sandyzhs/archive/2008/12/31/3662902.aspx
2. 对象在内存中的布局(不考虑padding,太复杂;只使用int,并假设sizeof(int) == 4byte;IDE是VC6.0)。
类 | 内存 | 类 | 内存 |
| ||||||||||||||||||||||||||||
1) class A{int x; }; class B{int z;}; class C: public A, public B{ int n;}; |
| 2) class A{ int x;virtual void f1()}; class B{int y; virtual void f2()}; class D: A, B{int z; virtual void f3()}; |
| |||||||||||||||||||||||||||||
3) class A{ int x;virtual void f1()}; class B{int y;}; class D: A, B{int z; virtual void f3()}; |
| |||||||||||||||||||||||||||||||
4) class A{int a;}; class B1: A{int b1;}; class B2: A{int b2;}; class C1: virtual B1{int c1;}; class C2: virtual B2{int c2;}; class D: C1, C2{int d;}; 这个比较变态,注意:相对于B1和B2来说,A只是普通基类。A在D中根本就没有被共享 |
| |||||||||||||||||||||||||||||||
5) class A{int x;virtual void f()}; class B: virtual A{int z1;}; class C: virtual A{int z2;}; class D: B, C{int d;}; (右面**:可能是offset to A,也可能是B中自带的vptr。书上说是前者;根据分析应该是这样) |
| |||||||||||||||||||||||||||||||
6) class A{int x; virtual f1()}; class B:virtual A{int z1; virtual f2()}; class C:virtual A{int z2; virtual f3()}; class D: B, C{int d; virtual f4()}; (注意:D的vptr肯定是和其基类共享了,但B、C的vptr还在) |
| 7) class X{int x;}; class Y1: virtual X{int y1;}; class Y2: virtual X{int y2;}; class Z1: Y1{int z1;}; class Z2: Y2{int z2;}; class W: Z1, Z2{int w;}; |
|
至此,《深度探索c++对象模型》学习笔记 系列全部结束。