Welcome

首页 / 软件开发 / VC.NET / vs2008下C++对象内存布局(3):加上虚函数

vs2008下C++对象内存布局(3):加上虚函数2009-11-07 csdn博客 快乐虾这次我们为父类加上虚函数:

class CParent
{
public:
int parent_a;
int parent_b;

public:
virtual void parent_f1()
{
parent_a = 0x10;
}
virtual void parent_f2()
{
parent_b = 0x20;
}
};

class CChild : public CParent
{
public:
int child_a;
int child_b;

public:
virtual void parent_f1()
{
child_a = 0x30;
}
virtual void parent_f2()
{
child_b = 0x40;
}
};
CChild child, *pchild;
CParent parent, *pparent;

1.1.1 内存布局

同样,我们先对其进行简单赋值再观察内存变化。

先对父类进行赋值:

parent.parent_a = 1;
004139FE C7 05 B8 81 41 00 01 00 00 00 mov dword ptr [parent+4 (4181B8h)],1
parent.parent_b = 2;
00413A08 C7 05 BC 81 41 00 02 00 00 00 mov dword ptr [parent+8 (4181BCh)],2

看内存:

0x004181B4 5c 68 41 00 01 00 00 00 02 00 00 00 00 00 00 00 hA.............

很显然,在数据之前插入了四个字节,猜想这个应该就是所谓的vtbl的指针,如果这样,那么所有同类对象都应该有相同的指针,定义两个变量:

CParent v1, v2;

先看v1的内存:

0x0012FF58 5c 68 41 00 cc cc cc cc cc cc cc cc cc cc cc cc PhA.............

再看v2的内存:

0x0012FF44 5c 68 41 00 cc cc cc cc cc cc cc cc cc cc cc cc PhA.............

果然是一样的,嘿。

再看子类的赋值:

child.child_a = 3;
00413A12 C7 05 AC 81 41 00 03 00 00 00 mov dword ptr [child+0Ch (4181ACh)],3
child.child_b = 4;
00413A1C C7 05 B0 81 41 00 04 00 00 00 mov dword ptr [child+10h (4181B0h)],4

看&child的内存:

0x004181A0 50 68 41 00 00 00 00 00 00 00 00 00 03 00 00 00 PhA.............
0x004181B0 04 00 00 00 5c 68 41 00 01 00 00 00 02 00 00 00 ....hA.........

很明显,父类和子类指向的vtbl是不一样的。