什麼是多型?同乙個事物多種表現形式,強調介面的重用性。看下面:
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...