第一章 关于对象

来源:互联网 发布:clasence 软件 编辑:程序博客网 时间:2024/05/29 13:19

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而由内部产生的任何额外负担。




0 0
原创粉丝点击