深入探索c++对象模型()

(一) 加上封装后的布局成本

  c++在布局 在存取时间上主要的额外负担是有virtual 引起,包括: 虚函数  虚子类

虚函数表是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。


一般继承(有虚函数覆盖)

1)虚函数按照其声明顺序放于表中。

2)父类的虚函数在子类的虚函数前面。【父.f】【父.g】【子.f1】【子.g1】

一般继承(有虚函数覆盖)

1)覆盖的f()函数被放到了虚表中原来父类虚函数的位置。

2)没有被覆盖的函数依旧。【子.h】【父.g】【子.f1】【子.g1】

多重继承(无虚函数覆盖)

1)  每个父类都有自己的虚表。

2)  子类的成员函数被放到了第一个父类的表中。(所谓的第一个父类是按照声明顺序来判断的)

【父0.f】【父0.g】【子.f1】【子.g1】【父1.f2】【父1.g2】【父2.f3】【父2.g3】

多重继承(有虚函数覆盖)

【子.f】【父0.g】【子.f1】【子.g1】【子.f】【父1.f2】【父1.g2】【子.f】【父2.f3】【父2.g3】

(二) C++对象模型

     非static数据对象配置与class object 内,静态数据对象,静态函数对象,非静态函数存在与class object之外(基本对象模型)

  对包含虚函数的class,生成virtual table,class object 中保存 指向virtual table 的指针 vbtr;vbtr的设定和重置都由构造函数,析构函数,和拷贝函数完成,并保存type_info (用以支持RTTI)(表格驱动模型)

  虚拟继承继承 bases class 不管在继承串链中派生多少次,永远只会有一个实体,例如  

  class istream:virtual public class ios{...};

  class ostream:virtual public class ios{...};

      class iostream:public class istream,public class  ostream{};

  

原文地址:https://www.cnblogs.com/WillingCPP/p/2989754.html