CChild child;
CChild* pChild = &child;
const char* pname1 = typeid(child).name();
const char* pname2 = typeid(pChild).name();
pname1 : "class CChild"
pname2 : "class CChild*"
【干净的class,内存布局】
COffsetTest oftest;
COffsetTest* pclass = &oftest;
int* px = &oftest.x;
int* py = &oftest.y;
pclass = 0x0012f45c
px = 0x0012f45c
py = 0x0012f460
【有虚函数表且多继承的class,内存布局】
CChild child;
CChild* pChild = &child;
CParent* pParent1 = (CParent*)pChild;
CParent2* pParent2 = (CParent2*)pChild;
int *pChildX = &child.x;
int *pParentX1 = &pParent1->param1;
int *pParentX2 = &pParent2->param2;
pChild = 0x0012f5a0
pParent1 = 0x0012f5a0
pParent2 = 0x0012f5a8
pChildX = 0x0012f5b4
pParentX1 = 0x0012f5a4
pParentX2 = 0x0012f5ac
内存布局
[基类1虚函数表指针]
[基类1成员变量]
[基类2虚函数表指针]
[基类2成员变量]
[自身类虚函数表指针(如果有)]
[自身类成员变量]
【rtti信息】
存储在虚函数表的第一个位置
- pParent1 0x0012f5a0 {_fun1=0x0041173a CChild::callfunc(int) x=-858993460 } CParent *
+ [CChild] {_fun1=0x0041173a CChild::callfunc(int) x=-858993460 } CChild
- __vfptr 0x004259dc const CChild::`vftable'{for `CParent'} *
[0] 0x004111ef CChild::`vector deleting destructor'(unsigned int) *
[1] 0x00411d89 CParent::parent1(void) *