虛函式表和虛表指標

2021-10-14 03:55:39 字數 1207 閱讀 2534

用virtual宣告類的成員函式稱之為虛函式

用於實現多型

存在繼承關係,子類繼承父類

子類重寫了父類的virtual function

子類以父類的指標或者引用的身份出現

其中的關鍵就是兩點:

想要理解其中的結構,還是要從記憶體布局看起

下面都是用debug的方式,檢視其中的布局大小

一定要理解下面的四段**

1,普通類的記憶體布局

因為普通函式並不佔記憶體,所以此時物件a的並不顯示記憶體

2,虛函式類的記憶體布局

**:此時因為類內定義了虛函式,所以就有了乙個虛函式指標:_vfptr

這個函式指標指向的即為虛函式表,表內是兩個虛函式的位址

3,子類不重寫父類虛函式的記憶體布局

**:此時子類繼承了父類的虛函式,但是沒有重寫,因此子類的虛函式指標指向的表中依然存放的父類的虛函式,因此也可以看到,裡面的位址都是一樣的

4,子類重寫父類虛函式的記憶體布局

這個區域性變數中可以看到,重寫的函式虛函式表中的位址變了,沒重寫的函式,在虛函式表中的位址依然沒變。

上面四幅圖看懂就大概知道了虛函式表指標和虛函式表的關係了。

即當類中有虛函式時,就會自動產生乙個虛函式表指標,這個指標指向乙個虛函式表,表中就存放類中定義的虛函式

總結:

1,虛函式表指標

我們把物件首位址開始的4個位元組或8個位元組,這個位置我們稱之為虛函式表指標(可以新增點屬性看看位置)。它裡面包含乙個位址指向的就是虛函式表的位址

2,虛函式表

虛函式表裡面是一組位址的陣列(函式指標陣列),他所在的位置就是虛函式表指標裡面所儲存的位址,它裡面所包含的位址就是我們重寫了父類的虛函式的位址(沒有重寫父類的虛函式那麼預設的就是父類的函式位址)

虛函式表指標,虛函式表

對c 了解的人都應該知道虛函式 virtual function 是通過一張虛函式表 virtual table 來實現的。簡稱為v table。在這個表中,主是要乙個類的虛函式的位址表,這張表解決了繼承 覆蓋的問題,保證其容真實反應實際的函式。這樣,在有虛函式的類的例項中這個表被分配在了 這個例項...

虛函式指標和虛函式表

虛函式指標和虛函式表 虛函式表的定義 多型是由虛函式實現的,而虛函式主要是通過虛函式表 v table 來實現的。如果乙個類中包含虛函式 virtual修飾的函式 那麼這個類就會包含一張虛函式表 vftbl 虛函式表儲存的每一項是乙個虛函式的位址。在乙個物件的記憶體布局中,指向這張虛函式表的指標 v...

虛函式表和虛函式表的指標

有虛函式的類都有乙個虛函式表,它是實現多型的關鍵。虛函式表可以繼承,如果子類沒有重寫虛函式,那麼子類虛函式表中仍然會有該函式的位址,只不過這個位址指向的是基類的函式實現。如果子類重寫了相應的虛函式,那麼虛函式表中的位址就會改變,指向自身的函式實現。如果派生類中有自己的虛函式,那麼虛函式表中會新增該項...