Welcome

首页 / 软件开发 / C++ / c++类对象的内存模型

c++类对象的内存模型2010-06-02 csdn AtlasHRC++类对象内存结构

首先介绍一下C++中有继承关系的类对象内存的布局:在中,如果类中有虚函数,那么它就会有一个虚函数表的指针__vfptr,在类对象最开始的内存数据中。之后是类中的成员变量的内存数据。

对于子类,最开始的内存数据记录着父类对象的拷贝(包括父类虚函数表指针和成员变量)。之后是子类自己的成员变量数据。

对于子类的子类,也是同样的原理。但是无论继承了多少个子类,对象中始终只有一个虚函数表指针。

为了探讨C++类对象的内存布局,先来写几个类和函数

首先写一个基类:

class Base
{
public:
virtual void f() { cout << "Base::f" << endl; }
virtual void g() { cout << "Base::g" << endl; }
virtual void h() { cout << "Base::h" << endl; }
int base;
protected:
private:
};

然后,我们多种不同的继承情况来研究子类的内存对象结构。

1. 无虚函数集继承

//子类1,无虚函数重载
class Child1 : public Base
{
public:
virtual void f1() { cout << "Child1::f1" << endl; }
virtual void g1() { cout << "Child1::g1" << endl; }
virtual void h1() { cout << "Child1::h1" << endl; }
int child1;
protected:
private:
};

这个子类Child1没有继承任何一个基类的虚函数,因此它的虚函数表如下图:

我们可以看出,子类的虚函数表中,先存放基类的虚函数,在存放子类自己的虚函数。