找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2168|回复: 0
收起左侧

C++中继承内存分配

[复制链接]
ID:108615 发表于 2016-3-13 17:21 | 显示全部楼层 |阅读模式
如有错误,欢迎指正,谢谢!!!!
一、没有虚函数,没有继承的类内存结构:
     1.如下定义一个类:
     class A
     {
      public:
          void seta(int x) {a = x;};
          void setb(int x) {b = x;};
          int  sum() {return a+b;};
      private:
         int a;
         int b;
     };

二、没有虚函数,有继承的类内存结构:
  class A

   public:
    void seta(int x){a = x;};
   privated:
    int a;
  };

  class B:class A
  {
  public:
   void setb(int x){b = x;};
   privated:
    int b;
  };
在这样的实例中,先分配父类变量,再分配子类变量。
如果是多重继承的话,则按顺序分配父类的变量。

三、有虚函数,没有继承的类内存结构:
若果类中含有虚函数时,类对象的内存分配有不一样的地方。如:
  class A
  {
   public:
    virtual init(int x,int y){a = x;b = y;};
    virtual init(){a = 0;b=0;};
    int sum();
   priviate:
    int a,b;
  }
此时,在类实例内存中,首先是虚函数表指针,然后才分配变量。

四、有虚函数,单继承的类内存结构:
单继承关系分为虚函数覆盖和不覆盖两种,当不覆盖时,虚函数表先是父类的虚
函数表,然后是子类的虚函数表,当覆盖时,同样排序,但父类的被覆盖虚函数
地址为子类的相应的虚函数的地址。变量的分配和上面的相同。

五、有虚函数,多继承的类内存结构:
class C
{
public:
  virtual C1(){return 1;};
  virtual C2(){return 2;};
  setc(int x){c = x;};
private:
  int c;
};
class B
{
public:
  virtual B1(){d1=1;};
  virtual B2(){d2=2;};
private:
  int d1;
  int d2;
};

class A
{
public:  
  int sum(){return a1+a2;};
  virtual  A1(int x,int y){a1 = x;a2 = y;};
  virtual  A2(){a3=0;};
  virtual  A3(int x){a3 = x;};
  virtual  A4(){a1*a2*a3;};
private:
  int a1;
  int a2;
  int a3;
};
class D:public A,public B,public C
{
public:
  virtual D1(int x,int y){d1=x+10;d2=y+10;d3=d1*5;d4=d2*7;};
  virtual D2(){return 8;};
private:
  int d1,d2,d3,d4;  
};

此时,类D 的实例的内存分配应该如下:
A的虚函数表指针,紧跟这个虚函数表的是D的虚函数地址。
A的变量分配
B的虚函数表指针
B的变量分配
C的虚函数表指针
C的变量分配
D的变量分配
如果有虚函数覆盖,则和上面描述相同,用D的虚函数地址覆盖相应的父类的虚
函数表中虚函数的地址。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表