1. C++在布局以及存取时间上主要的额外负担是由virtual引起的,包括:
i. virtual function机制:支持一个有效率的“执行期绑定”;
ii. virtual base class:用以实现“多次出现在继承体系中的base class,有一个单一而被共享的实例”。
2. C++对象模式
i. 简单对象模型
一个slot对应一个members,members本身并不存放在object之中,只有“指向member的指针”才放在object内。
ii. 表格驱动对象模型
一个data member table和一个member function table
iii. Nonstatic data members被配置于一个class object之内,static data members则被存放在个别的class object之外。Static 和 nonstatic function members也被放在个别的class object之外。对于虚函数:
a. 每一个class产生一堆指向virtual functions的指针,放在表格之中,这个表格被称为virtual table(vtbl)。
b. 每一个class object被安插一个指针,指向相关的virtual table,这个指针被称为vptr。
3. C++中凡处于同一个access section的数据,必定保证以其声明顺序出现在内存布局当中。但当被放置在多个access sections中的各笔数据,排列顺序就不一定了。base classes和derived class的data members的布局也未有谁先谁后的强制规定。
4. 只有通过pointer和reference的间接处理,才支持OO程序设计所需的多态性质。
5. 在C++中,多态只存在于一个个的public class体系中,Nonpublic的派生类行为以及类型为void*的指针可以说是多态的,但它们并没有被语言明确地支持,也就是说它们必须由程序员通过显式的转换操作来管理。
6. C++支持多态的方式
i. 经由一组隐式的转化操作。例如把一个derived class指针转化成一个指向其public base type的指针:
shape *ps = new circle()
ii. 经由virtual function机制:
ps->rotate();
iii. 经由dynamic_cast和typeid运算符
if(circle *pc = dynamic_cast<circle*>(ps) )...
7. class object的大小组成有:
i. 其nonstatic data members的总和大小;
ii. 加上任何由于内存对齐的需求而填补上去的空间;
iii. 加上为了支持virtual而由内部产生的任何额外负担。