C++對象模型 -- 關於對象的概述

一、C++對象模型中,非靜態數據成員被配置於每一個對象之內,而靜態數據成員以及靜態與非靜態成員函數都是北被放置在所有Class Object之外的。其他的Virtual Function (虛函數) 則是以下面兩個步驟來支持:

    1. 每個類產生一堆指向虛函數的指針放置在虛表之中;

    2. 每個class object之內被添加了一個指針vptr,指向相關的虛表。vptr的設定和重置都由構造函數、析構和拷貝分配運算符自動完成。每一個class關聯的type_info object通常放在表格的第一個slot處。

    (在程序內部,對虛函數的訪問全部都是被轉換成vptr對虛表的訪問。)

 

二、多態的性質只有通過指針或者引用才能發揮作用;

        

    多態的主要用途是經由一個共同的藉口來影響類型的封裝,這個接口通常被定義在一個抽象的base class中。

 

三、表現一個類對象需要的內存空間由以下幾點決定:

       1. 其非靜態數據成員的總和大小;

       2. 加上任何由於系統最小表示大小的內存填充需求而附加的空間;

       3. 加上爲了支持virtual而由內部產生的任何額外負擔。

    一個指針不管它指向哪一種數據類型,指針本身所需的內存大小是固定的一個word。加上繼承和多態以後,內存空間就要首先附加上基類的內存空間,然後再開始子類的內存空間計算。(子類只有一個虛表)

 

四、 子類指針和父類指針有什麼不同呢?

       

     ap所涵蓋的地址只包含B對象中的父類A所有的部分,而bp所涵蓋的地址包含整個B對象。ap是不能直接畜類B中的任何成員的,唯一例外的是通過virtual機制來實現。即ap調用虛函數時候,被賦予B類虛函數的特性。

       

    可是初始化函數在將一個對象拷貝到另一個對象的時候,爲什麼a的vptr沒有指向b的虛表呢?原來編譯器在初始化和制定操作之間做了仲裁,編譯器必須確保如果某個對象含有一個或更多的vptrs,那些vptrs的內容不會被基類的初始化或者改變。至於爲什麼a會調用A::fun(),這個在上面已經介紹過了。

 

上面內容是在閱讀《C++對象模型》時的讀書筆記,做一個簡單的總結,以便整體的理解和以後的回顧。

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章