c++物件的記憶體分析(5)
binhua liu
這裡我準備只主要闡述介面,而不談一般的抽象類。因為在c++中,是沒有「介面」這種型別的,所有的介面事實上是定義為純抽象類。所謂純抽象類,就是沒有成員變數,沒有實現了的函式,只有純虛函式的抽象類。我相信,理解了介面這種特殊的抽象類,再去理解一般的抽象類是很容易的。
來看乙個例子,我們有介面ianimal來表示一般的動物行為,**如下:
class ianimal
;
這個介面在記憶體中的布局可以看作下圖中的樣子:
介面在記憶體中的布局可以看作乙個虛函式指標指向乙個虛函式表,虛函式表中的所有元素指向的位址為0,因為所有純虛函式都沒有被實現。
上面的描述只是為了大家理解方便,事實上這種說法是很不準確的。因為,乙個介面是絕對不能被構造的,這一點很重要。介面中的純虛函式都沒有被實現,如果允許構造他們,那麼在呼叫這些方法的時候,將造成非法訪問異常。
我們的問題來了,既然介面不允許被構造,那麼我們為什麼經常看到各種介面型別的物件呢。很簡單,這些介面型別的物件都是由從該介面繼承的子類物件通過型別轉換而來的。在子類中,我們需要實現介面的所有方法,否則,該子類仍是乙個抽象類。下圖中,我們描述了繼承了ianimal介面的horse類的記憶體結構圖,這個類還繼承了ivehicle介面:
關於horse類如果進行指標調整,怎麼轉換為ianimal介面型別,並實現多型特性的,我們在前面的章節中不止一次涉及到,即使是介面,也沒有什麼不同,我們這裡不打算再重複。
下面,我們要談的是,為什麼我們要使用介面呢? 由於本文主要研究的是物件的記憶體布局,所以,關於這個涉及設計模式的主題,我只準備簡單的講述,這個主題太大了,因此我只希望下面的描述能給你一些關於介面應用場景的靈感。我們經常聽到關於介面的描述是「只要實現了某某介面,物件就能實現某某功能/流程」,或者「就能被某某方法/模組呼叫來實現某某功能/流程」。 我們來看下面的**:
C 物件的記憶體分析(6)
本節討論建構函式,析構函式和虛析構函式。可能很多人都有這樣的經歷,面試時經常被問到 什麼情況下要使用虛析構函式,為什麼要使用虛析構函式?本文將試圖對編譯器的實現機制進行分析,來回答這個問題。我們從例子來分析,首先我們來看下面這個繼承鏈 如下 class cbasic 反編譯我們可以看到,csenio...
C 物件的記憶體分析(6)
c 物件的記憶體分析 6 binhua liu 本節討論建構函式,析構函式和虛析構函式。可能很多人都有這樣的經歷,面試時經常被問到 什麼情況下要使用虛析構函式,為什麼要使用虛析構函式?本文將試圖對編譯器的實現機制進行分析,來回答這個問題。我們從例子來分析,首先我們來看下面這個繼承鏈 如下 class...
物件記憶體分析
定義乙個類,用來模擬 手機 事物。屬性 品牌,顏色 行為 打 發簡訊 對應到類中 成員變數 屬性 string brand 品牌 double price string color 顏色 成員變數 行為 public void call string who 打 public void sendme...