這個問題一直似是而非的,昨天閒著無事,便細看一下,發現還是挺容易的。
總結起來可以分為以下幾塊:
1、空類的記憶體分布
2、帶變數的類的記憶體分布
3、帶虛函式的類的記憶體分布
4、帶虛函式的子類的記憶體分布
5、關於虛析構的描述
6、關於純虛函式為何必須在子類中實現的問題。
未完成部分:
1、關於虛基類的結構分布。
1、空類的記憶體分布比較簡單,一般用乙個位元組表示,據說是為了標識類而作的特別的安排。如下**:
class a{}
則sizeof(a) 為1.
2、如果類中包含變數,則類的大小為變數的大小。
3、類中一旦帶有虛函式,則類的大小增加4個位元組,前4個位元組(針對32位機器)為虛表的入口位址,此位址指向乙個陣列,用來存放虛函式的位址
4、子類中虛表指向的陣列,對於未覆蓋的虛函式,直接沿用父類的虛函式位址,已經覆蓋的則改寫成子類的虛函式位址
5、虛析構函式也是虛函式,在虛表陣列的最後乙個,由於虛析構呼叫時由作業系統加入某些引數,因此不能手工呼叫。
6、我們知道,純虛函式的介面在子類中必須全部實現,否則程式會出錯,原因是純虛函式在父類中由於沒有實現,系統指向的是乙個錯誤位址,子類若有部分未實現的話,會依樣把那些位址也放入虛表中,造成錯誤。
#include "執行結果:stdafx.h
"#include
< iostream >
using
namespace
std;
class
base
intbase_;
virtual
void f1() = 0
;
virtual
void f2() = 0;};
class mostdrive : public
base
void
test()
virtual
void f1()
virtual
void f2()
intmostdrive_;
};typedef
void(*fun)();
intmain()
in base
virtual pointer = 0012ff58
address of vtable = 004184d8
value at vtable 1st entry = 004111db
value at vtable 2nd entry = 004111db
in mostdrive
virtual pointer = 0012ff58
address of vtable = 00417940
value at vtable 1st entry = 00411145
value at vtable 2nd entry = 004110c8
------------------------test---------------------
in drive
virtual pointer = 0012ff58
address of vtable = 00417940
value at vtable 1st entry = 00411145
value at vtable 2nd entry = 004110c8
------------in main()-----------------------sizeof(mostdrive)=12
virtual pointer = 0012ff58
address of vtable = 00417940
value at vtable 1st address = 00417940
value at vtable 1st entry = 00411145
value at vtable 2nd address = 00417944
value at vtable 2nd entry = 004110c8
mostdrive::f1
mostdrive::f2
first value address = 0012ff5c
first value = 1
second value address = 0012ff60
second value = 3
圖示如下:
再談帶有虛函式的類物件之記憶體結構
前篇 http blog.csdn.net pathuang68 archive 2009 04 21 4096521.aspx 下面的 中,類base中定義了兩個虛函式vfbase 1 和vfbase 2 另外還定義了乙個整形成員變數m base include using namespace s...
c 中的虛函式,虛表指標,及類在記憶體中的分布
c 中虛函式的呼叫及物件的內部布局1 來自 lizhe1985 在我那篇 c 中的this指標 中,我通過分析c 編譯後生成的彙編 來分 析this指標的實現方法。這次我依然用分析c 編譯後生成的彙編 來說明c 中 虛函式呼叫的實現方法,順便也說明一下c 中的物件內部布局。下面所有的彙編 都 是用v...
帶有虛函式的菱形繼承和帶有虛函式的菱形虛繼承
對於某些函式來說,基類希望它的派生類定義適合自身的版本,此時基類就將這些函式宣告為虛函式。在存在虛函的類,建立物件時會產生虛表指標,虛表指標指向乙個虛表,這時就可以通過虛表訪問自己定義的函式。通過下面兩種繼承進行分析 帶有虛函式的菱形繼承 以下圖的模型為例進行分析 我們觀察c類物件在記憶體中的結構 ...