多型實現之虛函式

2022-07-11 07:57:08 字數 1227 閱讀 6421

多型的實現分為靜態多型和動態多型,靜態多型主要靠函式過載,動態多型主要靠虛函式

當類中宣告了虛函式之後,該類的記憶體映像會獲得乙個虛表指標,叫做_vfptr指向該類的虛表,下面的我測試使用的類圖(有的沒必要的東西沒有寫)

這裡恰好還是乙個菱形繼承,但是就像我之前說的虛繼承和虛表關係不大,所以單繼承也是可以測試的

其中高亮的部分就是虛表指標,用記憶體視窗就可以看到虛表中存放的東西了,每乙個多型類的物件都有乙個自己的虛表指標,並且多繼承的物件會有多個_vptr指標

m和m1的_vptr指向同乙個虛表

多繼承物件有更多的_vfptr指向不同的虛表

這裡我們雖然看到的是_vfptr是放在m物件的最後,但是在記憶體中_vfptr是存放在m記憶體空間一開頭的地方!!如果我們想要強取虛表並且把虛表中的函式指標列印出來看看的話,只要取m的位址(就是一開始的頭位址)就可以了,=(雖然一般人不會這麼做,如果只是想看看的話),如果還想列印其他的虛表的話就把指標偏移一下,_vfptr就是指向虛表的指標,就相當於指向乙個函式指標陣列的第乙個元素指標,獲得了這個指標之後就可以像訪問陣列一樣訪問這個虛表了

如下圖所示物件m位址空間一開始就是虛表指標_vfptr,緊接著是虛繼承表指標_vbptr(要區分開!)(虛繼承表詳解看菱形繼承那篇部落格)

強取虛表列印**

1

void printvtable(int *vtable)

29 }//

因為指標和int型變數都是4個位元組,所以我們用整型變數來存放位址

1011

1213

14int *vtable = (int *)(*(int *)&m);

15 printvtable(vtable);

多型之虛函式

虛函式實現執行時多型。虛函式宣告只出現在類定義函式原型宣告中,而不能在成員函式實現的時候。虛函式一般不宣告為內聯函式,因為虛函式訪問時需要動態繫結,而內聯函式是靜態的。virtual關鍵字可以省略,當基類中已經宣告了虛函式,那麼派生類中和基類同返回值,同名,同形參的函式即使沒有加virtual也可判...

c 多型之虛函式憑什麼實現多型

我們都知道,有純虛函式的類成為抽象類,一般作為介面類使用。含有虛函式的類都會產生乙個虛函式表指標,指向虛函式表。如果基類中有虛函式,那麼派生類同樣會繼承基類的虛函式表指標。如圖 vptr作為虛函式表指標,指向虛函式表vtable,表中內容看圖即可理解。如果派生類講vfub2函式進行修改,就會影響派生...

利用虛函式實現多型

關鍵字 virtual 針對基類的不同派生類,如果派生類重新定義虛函式,那麼派生類的虛函式將覆蓋基類對應虛函式的實現。如果強制派生類定義某個函式,則可以在基類中將這個虛函式宣告為純虛函式,也就是基類不實現這個虛函式,所有實現留給派生類。當類中含有純虛函式時,這個類就是抽象類。不能建立抽象類的物件,否...