深度探索C 物件模型 之物件的差異加上多型之後

2021-09-02 07:52:41 字數 1931 閱讀 3718

class zooanimal;

class bear :public zooanimal;

dances dance_know;

};zooanimal za("zoey");

zooanimal *pza = &za;

bear b("yogi");

bear *pb = &b;

bear &rb = *pb;

基類zooanimal的物件布局如下,假設指標pza的位址為1000;

基類物件za的記憶體布局

加上多型之後派生類bear的記憶體布局如下(假設指標位址為1000):

子類bear的記憶體分配

乙個bear指標和乙個zooanimal指標有何不同之處?

bear b;

zooanimal *pz = &b;

bear *pb =&b;

以上兩指標pz pb都指向bear的物件的第乙個byte,期間的差異是,pb所覆蓋的位址包含整個bear object, 而pz所覆蓋的位址只包含bear object 中的zooanimal subobject.

除了zooanimal subobject中出現的member你不能夠用pz來直接處理bear的任何member,唯一是通過vritual機制。

當我們寫pz->rotate();時,pz的型別將在編譯時期決定以下幾點:

1、固定的可用介面,pz只能呼叫zooanimal 的public介面。

2、該介面是zooanimal的公共介面。

在每乙個執行點,pz所指的object類可以決定rotate()所呼叫的實體。型別資訊的封裝不是維護於pz中,而是維護於link之中,此link存在於object的vptr和vptr所指的virtual table之間。

如下這種

bear b;

zooanimal za = b;//這會引起切割(sliced)

//呼叫zooanimal::rotate()

za.rotate();

1、為什麼za呼叫的是zooanimal實體而不是bear實體呢?

za並不是(而且也絕不會是)乙個bear,它是乙個zooanimal,多型所造成的 「乙個以上的型別」 的潛在力量,並不能夠實際發揮在 「直接訪問 objects」 這件事上。有乙個似是而非觀念:oo程式設計並不支援對object的直接處理。乙個point 或乙個reference之所以支援多型是因為它們並不引發記憶體中的任何委託操作,會受到改變的只是它們所指向的記憶體的」大小和內容解釋方式「而已。

然而任何試圖改變object za的大小,便會違反其定義中受契約保護的」資源需求量「。如果把整個bear object指給za,則會溢位它所配置得到的記憶體。

當乙個base class object 被直接初始化為乙個derived class object時,derived object就會被切割(sliced),多型於是不再呈現。總而言之,多型是一種威力強大的設計機制,允許你繼承乙個抽象的public介面之後,封裝相關的型別。c++通過class 的pointer和reference來支援多型,這種程式風格叫做 」物件導向「。

2、如果初始化函式將乙個object內容拷貝到另乙個object中去,為什麼za的vptr不指向bear的vritual table?

編譯器在初始化及指定操作之間做了仲裁,編譯器必須確保某個object含有乙個或乙個以上的vptrs的內容不會被base class object初始化所改變。

深度探索C 物件模型之C 物件模型筆記

0.菜鳥覺得,在看這本書的時候最好切換角色,把自己的思維轉換成編譯器開發者,去考慮問題,這樣會容易理解些.當然這樣很難,就想著自己要解決什麼樣的問題好了 1.在c 中,類的資料成員有兩種 靜態和非靜態 成員函式有三種 靜態,非靜態 虛函式。之所以這樣分,大概是因為在設計c 物件模型時,非靜態的資料成...

深度探索C 物件模型

傳世經典書叢 深度探索c 物件模型 美 stanley b.lippman 斯坦利 b.李普曼 著 侯捷 譯 isbn978 7 121 14952 8 2012年1月出版 定價 69.00元 16開 356頁 宣傳語 如果你是一位c 程式設計師,渴望對於底層知識獲得乙個完整的了解,那麼本書正適合你...

深度探索C 物件模型

傳世經典書叢 深度探索c 物件模型 美 stanley b.lippman 斯坦利 b.李普曼 著 侯捷譯 isbn978 7 121 14952 8 2012年1月出版 定價 69.00元 16開 356頁 宣傳語 如果你是一位c 程式設計師,渴望對於底層知識獲得乙個完整的了解,那麼本書正適合你 ...