1.虛函數
虛函數是c++實現多態的有力武器,聲明虛函數只需在函數前加上virtual關鍵字,虛函數的定義不用加virtual關鍵字。
2.虛函數要點
(1) 靜態成員函數不能聲明為虛函數
可以這麼理解,虛函數是個動態的概念,在運行的時候才決定調用哪個,而靜態函數是個靜態的概念。更加細化的解釋是,靜態函數與對象無關,不可以用對象實例調用,顯然是與虛函數的概念違背的。
(2)構造函數不能是虛函數
很明顯,虛函數表的建立都是在構造函數中進行的,如果構造函數是虛函數的話,就變成了雞生蛋蛋生雞的問題了。
(3)析構函數最好是虛函數
析構函數最好是虛函數,除非不想作為基類使用,聲明稱虛函數是個好習慣,這樣delete用父類指針指向的子類對象就可以自動找到子類的析構函數了。
3.虛函數表在內存中的構造(gcc)
虛函數表一般在對象所占內存的最開始的位置。
(1)無繼承
無繼承的話討論虛函數無意義,但是需要說明的是此時虛函數按照聲明的順序擺放。
(2)一般繼承,無虛函數覆蓋
這樣的話,虛函數表中先放父類虛函數指針,再按聲明順序擺放自己的虛函數指針
(3)單繼承,有虛函數覆蓋
子類對象的虛函數表中覆蓋父類虛函數的位置放置自己的虛函數指針,其他同(2)
(4)多重繼承
多重繼承意味著有多個虛函數表,。
這篇總結實際上是網上的一篇博文總結,該博文總結得非常好,所以我就摘錄了過來。
補充:
4.GCC和VC中對虛函數,虛基類內存布局的不同
要點:在普通繼承時沒區別,單繼承時虛函數表是共享的,但是虛繼承時,vc環境下,虛函數指針時不共享的,也就意味著多一個新的虛函數就得額外多一個指針。
5.關於虛函數、多態、內存布局的一個例子
6.多態的相關概念
比較清楚地描述了重載、隱藏、覆蓋的區別