(一) 加上封装后的布局成本
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{};