第一章 關于對象
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 閱讀(1814)
評論(7) 編輯 收藏 引用