簡(jiǎn)單對(duì)象模型(A Simple Object Model)
一個(gè)objects是一系列的slots。
members本身不放在object中,只有指向member的指針?lè)旁趏bject中。
? 避免members有不同類型,因而需要不同的存儲(chǔ)空間所招致的問(wèn)題
Object中的members是以slot的索引值來(lái)尋址。

用于C++指向成員的指針概念之中
表格驅(qū)動(dòng)對(duì)象模型(A Table-driven Object Model)

屏幕快照 2017-04-28 下午8.09.27.png
用于virtual functions的一個(gè)有效方案
C++對(duì)象模型(The C++ Object Model)
Class object內(nèi): nonstatic data members
Class object外: static data members、static and nonstatic function members
Virtual functions:
- vtbl 存放每一個(gè)class生成的指向vf的指針
- 每一個(gè)class object 被添加一個(gè)指向vtbl的指針(vptr),設(shè)定和充值都由每一個(gè)class的構(gòu)造、析構(gòu)和拷貝運(yùn)算符自動(dòng)完成
- 每一個(gè)class關(guān)聯(lián)的type_info object(用以支持runtime type identification,RTTI)也經(jīng)由vtbl被指出來(lái)

屏幕快照 2017-04-28 下午8.23.00.png
繼承模型:
- 直接繼承:base class subobject的data members直接放置于derived class object中
優(yōu)點(diǎn):緊湊而且有效率的存取
缺點(diǎn):基類成員改變都導(dǎo)致派生類的重新編譯

屏幕快照 2017-04-28 下午10.02.19.png
- 虛擬繼承:多重繼承中特有的概念,在派生類中加入虛類指針(增加尋址時(shí)間,相當(dāng)于以時(shí)間換空間)
class A
class B1:public virtual A;
class B2:public virtual A;
class D:public B1,public B2;
虛擬繼承在一般的應(yīng)用中很少用到,所以也往往被忽視,這也主要是因?yàn)樵贑++中,多重繼承是不推薦的,也并不常用,而一旦離開(kāi)了多重繼承,虛擬繼承就完全失去了存在的必要因?yàn)檫@樣只會(huì)降低效率和占用更多的空間。
C++程序設(shè)計(jì)模型
- 程序模型(procedural model)
- 抽象數(shù)據(jù)類型模型(abstract data type model,ADT)
提供一組表達(dá)式(public 接口),重載運(yùn)算符操作 - 面向?qū)ο竽P停╫bject-oriented model)
繼承,共同相關(guān)類型由抽象基類封裝起來(lái)
通過(guò)指針或者引用來(lái)間接處理基類對(duì)象才體現(xiàn)多態(tài)
C++支持多態(tài)的方法:
- 經(jīng)由一組隱含的轉(zhuǎn)化操作
例如:shape *ps = new circle() - 經(jīng)由virtual function機(jī)制
例如:ps->rotate() - 經(jīng)由dynamic_cast 和typeid運(yùn)算符
例如:circle *pc = dynamic_cast< circle* > (ps)
Class object的內(nèi)存占用
- 其 nonstatic data members 的總和大小
- 對(duì)齊所填補(bǔ)的空間
在32位計(jì)算機(jī)上,通常alignment位4bytes(32位),以使bus的“運(yùn)輸量”達(dá)到最高效率 - 支持virtual而產(chǎn)生的額外負(fù)擔(dān)
指針類型告訴編譯器如何解釋某個(gè)地址中的內(nèi)存內(nèi)容及其大小,轉(zhuǎn)型(cast)就是影響解釋方式