第一章 關(guān)于對(duì)象
C++布局以及存取時(shí)間是主要的額外負(fù)擔(dān)是由 virtual 引起,包括:
Virtual function 機(jī)制 用以支持一個(gè)有效率的“執(zhí)行期綁定”(running binding).
Virtual base class 用以實(shí)現(xiàn)“多次出現(xiàn)在繼承體系中的base class ,有一個(gè)單一而被共享的實(shí)體”。
1.1 C++ 對(duì)象模型(the c++ object model)
簡(jiǎn)單對(duì)象模型(a simple object model)
在這個(gè)簡(jiǎn)單模型中,一個(gè)object是一系列的slots,每一個(gè)slot指向一個(gè)member. Members按其聲明次序,各被指定一個(gè)slot.每一個(gè)data member 或 function member 都有自己的一個(gè)slot.
表格驅(qū)動(dòng)對(duì)象模型(A Table-driven object Model)
是把所有與members 相關(guān)的信息抽象出來,放在一個(gè)data member table和一個(gè)member function table之中,class object 本身則內(nèi)含指向這兩個(gè)表格的指針。
C++對(duì)象模型(The C++ Object Model)
在此模型中,Nonstatic data members 被配置在每一個(gè)class object 之內(nèi),static data members 則被存放在所有的class object 之外。Static 和 nonstatic function members 也被放在所有的class object 之外。 Virtual functions 則以兩個(gè)步來支持:
1.每一個(gè)class 產(chǎn)生出一堆指向 virtual function的指針,放在表格之中。這個(gè)表格被稱為 virtual table。
2.每一個(gè)class object 被添加一個(gè)指針,指向相關(guān) virtual function.
1.2 關(guān)鍵詞所帶來的差異(A Keyword Distinction)
C struct 在C++中的一個(gè)合理用途,是當(dāng)你要傳遞“一個(gè)復(fù)雜的class object 的全部或部分”到某個(gè)C函數(shù)中去時(shí),struct 聲明可以將數(shù)據(jù)封裝起來,并保證擁有與C兼容的空間布局。然而這項(xiàng)保證只在組合(composition)的情況下才存在。如果是“繼承”而不是“組合”,編譯器會(huì)決定是否應(yīng)該有額外的data members 被安插到 base struct subobject 之中。
1.3 對(duì)象的差異(An Object Distinction)
C++ 以下列方法支持多態(tài):
1. 經(jīng)由一組隱含的轉(zhuǎn)化操作,例如把一個(gè)derived class 指針轉(zhuǎn)化為一個(gè)指向其 public base type 的指針:
Shape *ps = new circle();
2. 經(jīng)由 virtual function 機(jī)制
Ps->rotate();
3. 經(jīng)由 dynamic_cast 和 typeid 運(yùn)算符:
If(circle *pc = dynamic_cast<circle *> (ps)) …
一個(gè)pointer 或一個(gè)reference 之所以支持多態(tài),是因?yàn)樗鼈儾⒉灰l(fā)內(nèi)存中任何“與類型有關(guān)的內(nèi)存委托操作(type-dependent commitment)”;會(huì)受到改變的只是它們所指向的內(nèi)存的“大小和內(nèi)容解釋方式”而已。
posted on 2008-05-20 22:24
Macaulish 閱讀(1815)
評(píng)論(7) 編輯 收藏 引用