C 多型呼叫和繼承記憶體分布

2021-07-04 10:08:32 字數 1247 閱讀 6598

以下面**為例:

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繼...