首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 计算机考试 > 等级考试 > 复习指导 >

C++基础——c++类对象的内存模型(1)

2009-06-26 
c++类对象的内存

  C++类对象内存结构

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

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

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

  

 

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

  首先写一个基类:

  classBase

  {

  public:

  virtual void f() { cout << "Base::f" <  virtual void g() { cout << "Base::g" << endl;}

  virtual void h() { cout << "Base::h" << endl; }

  intbase;

  protected:

  private:

  };

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

  1.无虚函数集继承

  //子类1,无虚函数重载

  class Child1 : publicBase

  {

  public:

  virtual void f1() { cout << "Child1::f1" <  virtual void g1() { cout << "Child1::g1" << endl;}

  virtual void h1() { cout << "Child1::h1" << endl; }

  intchild1;

  protected:

  private:

  };

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

  

 

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

  2.有一个虚函数继承

  //子类2,有1个虚函数重载

  class Child2 : publicBase

  {

  public:

  virtual void f() { cout << "Child2::f" <  virtual void g2() { cout << "Child2::g2" << endl;}

  virtual void h2() { cout << "Child2::h2" << endl; }

  intchild2;

  protected:

  private:

  };

热点排行