C 多型(下)之多型的實現原理

2021-09-13 15:22:28 字數 3357 閱讀 3952

上篇部落格 多型(上) 我們介紹了多型的相關概念,以及抽象類及純虛函式。接下來我們來看看多型是怎麼實現的:這裡我們先來看一道經常會遇到的面試和筆試題

通過觀察上幅圖我們可以發現

這裡可能就會有人問這個虛函式表中到底存放的是什麼呢,下面我們就具體來分析一下

這裡我們稍微修改一下我們剛剛的**,給它新增了 乙個虛函式fun2()和乙個普通函式fun3()乙個派生類derive,並計算了兩個類的大小。

class base

virtual void func2()

void func3()

private:

int _b = 1;

};class derive : public base

private:

int _d = 2;

};int main()

這是兩個類的大小,以及在監視環境下所看到了物件中所儲存的資料

通過觀察和測試,我們可以知道以下幾個問題:

派生類物件d中也有乙個虛表指標,d物件由兩部分組成,一部分是父類繼承下來的成員,一部分是自己的成員,派生類的虛表指標是存在自己的成員部分的。基類物件b和派生類物件d的虛表指標是不一樣的,我們可以看到派生類對基類的fun1()函式進行了重寫,所以d的虛表中儲存的是重寫過後的derive::fun1(),所以虛函式的重寫也叫覆蓋

派生類將fun2繼承下來,未進行重寫,直接放進了虛表中,fun3也繼承下來了,但是因為不是虛函式,沒有放進虛表中。

虛函式表的本質是乙個存放虛函式指標的指標陣列,這個指標陣列最後放了乙個nullptr

總結一下派生類虛表的生成:a.先將基類虛表內容拷貝乙份放在派生類自己的虛表當中。b.如果派生類重寫了基類的函式,就用派生類自己的函式對虛表基類的函式進行覆蓋。c.派生類自己新增的函式,按照宣告順序增加在派生類虛表的最後。

虛表中存的是虛函式的指標,虛函式和普通函式一樣是儲存在**段的,而虛表也是儲存在**段的。

同乙個類的不同物件的虛表是一樣的,乙個類在記憶體中只有乙份虛表。

注:看出滿足多型以後的函式呼叫,不是在編譯時確定的,是執行起來以後到物件的中取找的。不滿足多型的函式呼叫時編譯時確認好的。

靜態繫結又稱為前期繫結(早繫結),在程式編譯期間確定了程式的行為,也稱為靜態多型,比如:函式過載

動態繫結又稱後期繫結(晚繫結),是在程式執行期間,根據具體拿到的型別確定程式的具體行為,呼叫具體的函式,也稱為動態多型

我們在c語言中用到的printf和在c++中用到的cout都屬於多型的靜態繫結。

2.1 單繼承中的虛函式表

觀察下圖中的監視視窗中我們發現看不見func3和func4。這裡是編譯器的監視視窗故意隱藏了這兩個函式,也可以認為是他的乙個小bug。那麼我們如何檢視d的虛表呢?下面我們使用**列印出虛表中的函式。

typedef void(* vfptr) ();//將fun函式定義為乙個虛函式指標vfptr

class base

virtual void func2()

private:

int a;

};class derive : public base

virtual void func3()

virtual void func4()

private:

int b;

};void printvtable(vfptr* vtable)//列印出虛函式表中儲存的虛函式指標

2.2 多繼承中的虛函式表

相同的方法列印多繼承中的虛函式表中虛函式的位址,這裡就不贅述了,直接給**和結果吧

c 之多型篇(下) 虛表,多型呼叫

定義 在成員函式的形參列表後面寫上 0,則成員函式為純虛函式。包含純虛函式的類叫做抽象類 也叫介面類 抽象類不能例項化出物件。純虛函式 在派生類中重新定義以後,派生類才能例項化出物件。測試 class base 抽象類 class dervied public base 測試 class base ...

C 多型實現原理

用virtual關鍵字申明的函式叫做虛函式,虛函式肯定是類的成員函式。存在虛函式的類都有乙個一維的虛函式表叫做虛表。類的物件有乙個指向虛表開始的虛指標。虛表是和類對應的,虛表指標是和物件對應的。多型性是乙個介面多種實現,是物件導向的核心。分為類的多型性和函式的多型性。多型用虛函式來實現,結合動態繫結...

C 學習筆記之多型 多型的學習 多型學習

c 學習筆記之多型 多型的學習 多型學習 多型分為兩類 靜態多型 函式過載和運算子過載屬於靜態多型,復用函式名 動態多型 派生類和虛函式實現執行時多型 靜態多型和動態多型的區別 靜態多型的函式位址早繫結 編譯階段確定函式位址 動態多型的函式位址晚繫結 執行階段確定函式位址 動態多型滿足條件 動態多型...