15(多重继承虚继承的内存布局).docVIP

  • 7
  • 0
  • 约3.97千字
  • 约 16页
  • 2016-11-07 发布于重庆
  • 举报
15(多重继承虚继承的内存布局)

多重继承、虚继承的内存空间布局 对多重继承、虚继承的内存空间布局进行研究,循序渐进的进行处理,主要关注以下几点: 偏移表 虚表 数据成员 它们的位置 它们的大小及内容 它们间的关系。 1.1 单继承,无虚函数的情况 单继承、无虚函数的情况是: 1)基类的数据成员 派生类新增的数据成员 派生类的大小是基类数据成员和派生类新增数据成员大小之和。 顺序是按照上面的基类、派生类的顺序进行布局。 1.2 单继承,有虚函数的情况 单继承、有虚函数的情况: 派生类的虚表指针 基类的数据成员 派生类新增的数据成员 其中,派生类的虚表,是在基类的虚表基础之上所作的修改,有可能是: 对基类中虚函数地址的覆盖 派生类中新增的虚函数地址 只要有虚函数,就有虚表产生。 虚表中条目的个数,是本类中虚函数的个数 虚表中各条目的顺序,与类中声明(定义)的虚函数顺序一致 1.3 多重继承,无虚函数的情况 多重继承、无虚函数的情况是: 基类的数据成员 基类的数据成员 派生类新增的数据成员 这里与1.1 单继承,无虚函数的情况 的差别是——可能存在多个基类。 这里基类数据成员的排放,是按照继承的数据依次进行的。 1.4 多重继承,有虚函数的情况 多重继承,有虚函数的情况是: 基类的虚表指针 基类的数据成员 基类的虚表指针 基类的数据成员 派生类新增的数据成员 这里与1.2 单继承,有虚函数的情况 的差别是——虚表 这里说基类的虚表指针,其实是不太恰当的,因为它们实际上是派生类虚表的一部分。 也就说,派生类的虚表是由多个基类的虚表所构成的。不存在一个单一的派生类的虚表。 派生类的虚表条目是在各基类的虚表基础之上修改所得,可能包括: 对基类中虚函数的覆盖, 会更新各基类虚表中的条目 派生类中新增的虚函数地址, 会追加到第一个继承的基类的虚表中 至此,上面 1.1 单继承,无虚函数的情况 1.2 单继承,有虚函数的情况 1.3 多重继承,无虚函数的情况 1.4 多重继承,有虚函数的情况 是从单继承/多重继承, 无/有虚函数的角度 进行的梳理。 下面将以菱形继承为主线,来进行梳理。 (菱形继承中可能出现二义性,会逐步的引入虚继承,虚基类的概念) 菱形继承(diamond-inheritance) 1.5 菱形继承,无虚函数的情况 Class A {}; Class B: public A {}; Class C: public A {}; Class D: public B, public C {}; 菱形继承,无虚函数的情况是: 基类B的数据成员 基类A的数据成员 派生类B新增的数据成员 基类C的数据成员 基类A的数据成员 派生类C新增的数据成员 派生类D新增的数据成员 这里仍然是没有太大的变化,按照基类、派生类的顺序安放数据成员。 1.6 菱形继承,有虚函数的情况 Class A {}; Class B: public A {}; Class C: public A {}; Class D: public B, public C {}; 菱形继承,有虚函数的情况: 基类B的虚表指针 基类A的虚函数 (未被覆盖的部分) 基类B的虚函数 (覆盖A的部分,新增的部分) 派生类D的虚函数 (新增的部分) 基类B的数据成员 基类A的数据成员 派生类B新增的数据成员 基类C的虚表指针 基类A的函数 (未被覆盖的部分) 基类C的虚函数 (覆盖A的部分,新增的部分 基类C的数据成员 基类A的数据成员 派生类C新增的数据成员 派生类D新增的数据成员 仍然要说一点,这里说基类的虚表指针,其实是不太合适的,它们是派生类的虚表的一部分,是派生类在基类的虚表基础之上所做修改而来的: 如果派生类中的虚函数与基类中的形成覆盖,则派生类会对基类的虚表中相应条目做覆盖处理 派生类中新增的虚函数地址,追加至第一个继承的基类虚表中。 1.7 菱形继承,无虚函数,为虚继承的情况 在上面的 1.5 菱形继承,无虚函数的情况 1.6 菱形继承,有虚函数的情况 中,最基类A,在内存空间中有多份拷贝。 利用虚继承可以解决,此时最基类A成为虚基类。 所以,菱形继承,无虚函数,为虚继承的情况,也就是菱形继承,无虚函数,有虚基类的情况。 虚继承的引入,使得虚基类在内存中仅存一份拷贝,同时带来的影响还有内存空间布局的变化。 大概有: 虚基类的数据成员在内存中的位置 偏移表 偏移表的存在,是因为——虚基类的单份存在,而虚基类A又被B, C所共享,所以对B,C而言,它们就各自需要确定A的所在位置。 偏移表就是用于该问题。 偏移表的数目,就是直接继承自虚基类的派生类的数目。 现在来一一测试。 在看到这些

文档评论(0)

1亿VIP精品文档

相关文档