第一章 关于对象
C++布局以及存取时间是主要的额外负担是由 virtual 引起,包括:
Virtual function 机制 用以支持一个有效率的“执行期绑定”(running binding).
Virtual base class 用以实现“多次出现在继承体系中的base class ,有一个单一而被共享的实体”。
1.1 C++ 对象模型(the c++ object model)
简单对象模型(a simple object model)
在这个简单模型中,一个object是一系列的slots,每一个slot指向一个member. Members按其声明次序,各被指定一个slot.每一个data member 或 function member 都有自己的一个slot.
表格驱动对象模型(A Table-driven object Model)
是把所有与members 相关的信息抽象出来,放在一个data member table和一个member function table之中,class object 本身则内含指向这两个表格的指针。
C++对象模型(The C++ Object Model)
在此模型中,Nonstatic data members 被配置在每一个class object 之内,static data members 则被存放在所有的class object 之外。Static 和 nonstatic function members 也被放在所有的class object 之外。 Virtual functions 则以两个步来支持:
1.每一个class 产生出一堆指向 virtual function的指针,放在表格之中。这个表格被称为 virtual table。
2.每一个class object 被添加一个指针,指向相关 virtual function.
1.2 关键词所带来的差异(A Keyword Distinction)
C struct 在C++中的一个合理用途,是当你要传递“一个复杂的class object 的全部或部分”到某个C函数中去时,struct 声明可以将数据封装起来,并保证拥有与C兼容的空间布局。然而这项保证只在组合(composition)的情况下才存在。如果是“继承”而不是“组合”,编译器会决定是否应该有额外的data members 被安插到 base struct subobject 之中。
1.3 对象的差异(An Object Distinction)
C++ 以下列方法支持多态:
1. 经由一组隐含的转化操作,例如把一个derived class 指针转化为一个指向其 public base type 的指针:
Shape *ps = new circle();
2. 经由 virtual function 机制
Ps->rotate();
3. 经由 dynamic_cast 和 typeid 运算符:
If(circle *pc = dynamic_cast<circle *> (ps)) …
一个pointer 或一个reference 之所以支持多态,是因为它们并不引发内存中任何“与类型有关的内存委托操作(type-dependent commitment)”;会受到改变的只是它们所指向的内存的“大小和内容解释方式”而已。
posted on 2008-05-20 22:24
Macaulish 阅读(1786)
评论(7) 编辑 收藏 引用