ps:編譯器對虛方法使用動態聯編,執行時根據物件決定呼叫父類還是子類的這個方法。
虛函式的工作原理是:基類的物件維護乙個虛函式表,所謂的維護,方式是用乙個隱藏指標指向虛函式表。這個虛函式表中記錄基類中定義的虛函式的函式位址。同樣,派生類的物件也維護這樣乙個虛函式表。不同的是,1)如果派生類並沒有重新實現基類的虛方法,則它的虛函式表記錄的該函式位址還是維持基類中的不變;2)如果重新實現了,則記錄新的函式位址。3)如果派生類還定義了自己的虛函式,則也要加到虛函式表裡來。
呼叫虛函式時候,程式檢視虛函式表的位址,然後尋找相應的函式。
所以,使用虛函式有一下成本:
1。會使得物件增大,因為要消耗儲存位址的空間。
2。編譯器要為每個類都建立虛函式位址表。
3。在表中查詢位址需要額外操作。
非虛函式雖然效率高,但不具有動態聯編的功能。
使用虛函式要注意:
1。建構函式不能是虛函式
2。析構函式應該是虛函式
3。友元函式不能是虛函式
網友的闡述: 指標的型別是可以強行轉來轉去的。普通情況你轉什麼型別就調對應型別的同名函式。但是虛函式實現多型後,儘管可能你把指標轉成父類的型別,但是因為建立的時候是子類的型別,它還是會呼叫子類的這個虛函式。 這樣可以統一**且正確運用子類的新特性。 也因為如此,如果父類虛函式不做實現而=0成為純虛函式,那麼父類就不可以例項化,這個沒有實現的虛函式也永遠不會呼叫。因為根據多型的動態聯編,總是會呼叫例項化了的子類的該方法。指標強行轉成父類也不會呼叫純虛函式。
C 虛函式與虛函式的工作原理
虛函式的工作原理 獲取物件的虛函式表位址 給類函式宣告virtual關鍵字,將該函式解釋為虛函式。基類定義的虛函式表明子類可以繼承並實現該虛函式。虛函式的最大作用為 可以通過基類指標或引用來接收乙個子類指標或者引用,並通過基類指標或引用來呼叫虛函式來實現相同的動作不同的實現方式,達到多型的目的。例子...
虛函式的工作原理
通常,編譯器處理虛函式的方法是 給每個物件新增乙個隱藏成員。隱藏成員中儲存 乙個指向函式位址陣列的指標。這種陣列稱為虛函式表 virtual function table,vtbl 虛函式表中儲存了為類物件進行宣告的虛函式的位址。總之,使用虛函式時,在記憶體和執行速度方面有一定的成本。包括 1 每個...
C 學習筆記 虛函式
虛函式主要用於c 中的多型特性,對於類的繼承而言,如果用父類的指標指向子類的的物件,當用該指標操作子類物件時,該指標只能操作父類中的函式,而對於子類中特有的和過載的方法,用該指標將無法使用。案例 class base class derive public base void show 派生類獨有的...