0.菜鸟觉得,在看这本书的时候最好切换角色,把自己的思维转换成编译器开发者,去考虑问题,这样会容易理解些.(当然这样很难,就想着自己要解决什么样的问题好了)
1.在C++中,类的数据成员有两种:静态和非静态;成员函数有三种:静态,非静态 ,虚函数。(之所以这样分,大概是因为在设计c++对象模型时,非静态的数据成员表现出来的问题属于同一类)。
2.对象模型的发展
2.1简单对象模型
这个模型中一个类对象就像是一维指针类型数组,按照类成员的声明顺序依次指向在该成员在内存中的虚拟地址。
2.2表格驱动模型
这种模型把所有的成员信息抽出来,放在一个数据成员表和一个成员函数表之中,类对象本身则含指向这个两个表格的指针。
2.3C++对象模型
这种模型中,非静态数据成员被配置于每一个类对象之内,静态数据成员则被放在所有类对象之外,静态和非静态成员函数也被放在所有的类对象之外,对于虚函数则通过以下两个步骤来支持:
1.每一个类产生出一堆指向虚函数的指针,放在表格中,即虚函数表(vtbl).
2.每一个类对象被添加了一个指针,指向相关的虚函数表,这个指针被叫做vptr.vptr的设定和重置都由每一个类的构造函数,析构函数,赋值运算符自动完成(具体实现后面再讲)。每一个类所关联的type info object(用来支持RTTI运行时类型识别)也经由虚函数表指出来,通常是放在表格的第一行。
2.4加上继承后的对象模型
C++支持单一继承,和多重继承,多重继承就会引发同基类二义性问题,这个时候应采用虚基类 virtual继承方式.
base table(基类表)模型
1、基类表被产生出来时,表格中的每一个slot(行)内含一个相关的基类地址,这点类似于虚函数表内含每一个虚函数地址一样。
2、每一个类对象内含一个指向基类的指针bptr,它会被初始化,指向其基类表
这种模型的缺点在于由于间接性而导致的空间和存取时间上的额外负担,优点在于每一个类对象中对于继承都有一致的表现形式:每个类对象都应该在某个固定位置上安放一个基类指针,于基类的大小或数目无关
版权声明:本文为博主原创文章,未经博主允许不得转载。