C 多型(動態)的實現原理

2021-10-01 09:51:33 字數 1027 閱讀 6625

什麼是多型?同乙個事物多種表現形式,強調介面的重用性。看下面:

class a 

virtual void show2()

};class b :public a

};class c :public a

};int main()

執行結果:相同的**a->show(),結果卻是不一樣的!這就是多型(動態)。

動態多型是利用虛函式實現的。在類中如果出現virtual關鍵字,那麼這個類的大小將會多出乙個指標的大小(32位4位元組,64位8位元組),多出來的這個指標(_vfptf)指向函式指標陣列的首位址,我們稱這個函式指標陣列為虛函式表。

子類在繼承基類時,會連同虛函式表一起繼承,如果重寫基類的虛函式,則會覆蓋掉虛函式表中的函式位址,這就是可以呼叫子類物件方法的根本原因。如上:a=&b;此時基類指標指向了子類物件b的虛函式表的首位址,通過解引用就可以呼叫子類b中的重寫的方法了。(這裡解釋一下,虛函式表相對於成員變數是排在前面的,所以&b的位址指向虛函式表的首位址)。

下面利用除錯來看看對面的內部:

當執行完主函式第三行時,觀察a,b變數(b繼承a),可以看到b重寫了show()函式,所以虛函式表的函式指標改變了,但是沒有重寫show2()函式,所以直接繼承了下來,位址不變!

當執行完第四行a=&b時,即把b物件的位址賦給a指標,此時a指向了b物件的虛函式表,因此a就可以呼叫b子類物件的函式了。同理,如果a=&c,那麼a指向c物件的虛函式表,a可以呼叫c的函式。

還有不明白的可以交流!(ps:其實如果畫圖來說應該會更直觀,我偷懶截圖了。。。)

C 多型的實現原理

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

C 多型的實現原理

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

C 多型的實現原理

純虛函式 virtual void breathe 0 即抽象類!必須在子類實現這個函式 即先有名稱,沒內容,在派生類實現內容 我們先看乙個例子 include class animal 注意,在例1 1的程式中沒有定義虛函式。考慮一下例1 1的程式執行的結果是什麼?答案是輸出 animal bre...