1. 使用class封装之后的布局成本:
(1)class并没有增加成本,data members直接内含在每一个class object之中,就像C struct一样。而member functions虽然被包含在class的声明之内,但是不出现在Object之中。每一个non-inline function 只会产生一个函数实体。至于inline function则会在每一个调用使用的地方产生一个函数实体(在调用点展开函数体)。
(2)class在布局以及存取时间上主要的额外负担是由virtual 引起,包括:
a. virtual function 机制用以支持一个有效率的“执行期绑定(runtime binding)”。
b. virtual base class 用以实现“多次出现在继承体系中的 base class ,有一个单一的被共享的实体”。
c. 发生在“一个 derived class 和其第二或后继之 base class 的转换”之间。
2. C++对象模型:
(1)类的模型结构:nonstatic function member 和 static function member 在类外。static data member 在类外。nonstatic data member 在类内。
(2)虚表:每个class 产生出一堆指向虚函数的指针,放在表格中,这个表格称为虚表(vtbl)。
(3)虚基类表:每个drive class 产生一堆指向虚基类的指针,放在表格中,这个表格称为虚基类表(btbl)。但是会产生存取时间上的额外负担
(3)每个class关联的 type_info object (用于RTTI)也由虚表指出来,通常放在表格第一个slot中。
(4)vptr:每个class object 安插一个指针,指向相关的vtbl,称为vptr。
(5)bptr:每个class object 安插一个指针,指向相关的btbl,称为bptr。

3. class object 需要多少内存:
(1)nonstatic data members的总和大小。
(2)加上由于alignment(校验)的需求而padding(填补)上去的空间。
(3)加上为了支持 virtual 而由内部产生的额外负担。
4. 指针类型:
指针类型告诉编译器如何解释某个特定地址中的内存及其大小。
dynamic_cast(指针转型),不会改变指针指向的真实地址,只会影响编译器对于“被指向内存的大小和内容”的解释方式。
5. C++ 以下列方法支持多态:
(1)经由一组隐含的转化操作。例如把一个 derived class 指针转换为一个指向其 public base type的指针:
baser *p = new driver();
(2)经由 virtual function 机制:
p->rotate();
(3)经由dynamic_cast和typied运算符:
driver *dd = dynamic_cast<driver *>( p );