帶有虛表的類的記憶體分布總結

2022-02-23 23:35:26 字數 2291 閱讀 9799

這個問題一直似是而非的,昨天閒著無事,便細看一下,發現還是挺容易的。

總結起來可以分為以下幾塊:

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類物件在記憶體中的結構 ...