以下面**為例:
class a
virtual void fa()
void faa()
};class b
virtual void fb(){}
};class c : public a
void fa()
void faa()
};void main()
首先c c; 建立乙個c型別的物件c,類c是繼承a的。在vs2012中除錯,在監視中檢視c的內容,如下圖所示:
可以看到c物件繼承了a物件的_vfptr、變數a,然後還有自身的變數c。_vfptr是指向vtable虛函式表的指標,可以看到該表中存放了乙個函式指標c::fa(),因為在a中宣告了虛函式fa(),並且在c中進行了重寫,所以虛函式表對應位置填寫的是c實現的fa()的函式位址。所以c的大小是12b。
a* a = &c; *a的大小為8b。
接著呼叫a->fa(); 看下在vs2012中反彙編的結果:
a->fa();
011d361e mov eax,dword ptr [a] // 獲取a指向物件的位址
011d3621 mov edx,dword ptr [eax] // 獲取_vfptr指向的位址
011d3623 mov esi,esp
011d3625 mov ecx,dword ptr [a]
011d3628 mov eax,dword ptr [edx] // 獲取vtable中第乙個虛函式指向的位址
011d362a call eax // 呼叫c::fa()
011d362c cmp esi,esp
011d362e call __rtc_checkesp (011d12f3h)
a->faa();
011d3633 mov ecx,dword ptr [a]
011d3636 call a::faa (011d1456h)
C 繼承多型下的記憶體分布
2012 05 08 23 36 58 虛函式是物件導向程式設計語言裡乙個很重要的機制,下面我們以乙個c 例子,分析其對應的c語言程式來說明虛函式的機制。物件導向有了乙個重要的概念就是物件的例項,物件的例項代表乙個具體的物件,故其肯定有乙個資料結構儲存這例項的資料,這一資料報括變數,介面函式指標,如...
C 繼承和多型
在c 的物件導向的大家庭裡,我感覺繼承算是很重要的了,因為有很多的東西都是依賴於繼承和多型的,所以單獨的在第三篇部落格裡做總結和昇華。繼承在面相物件的地方是乙個很是重要的東西,可以說在物件導向的世界裡沒有了繼承就沒有了這麼多的東西,而沒有了多型就沒有了多彩的世界。類的繼承是最為普遍的事情了,可是類又...
C 繼承和多型
剛學習了c 繼承和多型,對virtual override seal override new有點了解,在此寫下這篇文章以供以後參考,若有錯誤或不足,還望各位指出。這裡有3個類,分別是grandfather father son。好,我們現在來分析一下grandfather的遺產怎麼讓father繼...