虛函式的工作原理

2021-07-04 01:55:10 字數 851 閱讀 8597

通常,編譯器處理虛函式的方法是:給每個物件新增乙個隱藏成員。隱藏成員中儲存 乙個指向函式位址陣列的指標。這種陣列稱為虛函式表(virtual function table, vtbl)。虛函式表中儲存了為類物件進行宣告的虛函式的位址。

總之,使用虛函式時,在記憶體和執行速度方面有一定的成本。包括:

1、每個物件都將增大,增大量為儲存位址的空間。

2、對於每個類,編譯器都建立乙個虛函式位址表(陣列)。

3、對於每個函式呼叫,都需要執行一項額外的操作,即到表中查詢位址。

有關虛函式的注意事項:

1、在基類方法的宣告中使用關鍵字virtual可使該方法在基類以及所有的派生類中是虛的。

2、如果使用指向物件的引用或指標呼叫虛函式,程式將使用為物件型別定義的方法,而不使用為引用或指標型別定義的方法。這又稱為動態聯編或晚期聯編。

3、如果定義的類將被用作基類,則應將那些要在派生類中重新定義的類方法宣告為虛的。

4、建構函式不能是虛函式。

5、析構函式應當是虛函式,除非類不用作基類。即使這個類不用作基類,這只是乙個效率方面的問題。

友元:

友元不能是虛函式,因為友元不是類成員。

重新定義不會生成函式的兩個過載版本,重新定義繼承的方法並不是過載。無論引數列表是否相同,該操作將隱藏所有的同名基類方法。

這引出了兩條經驗規則:

一、如果重新定義繼承的方法,應確保與原來的原型完全相同。(除了當返回型別是基類引用或指標,則可以修改為指向派生類的引用或指標,這稱為返回型別協變)。

二、如果基類宣告被過載了,則應在派生類中重新定義所有的基類版本。如果只重新定義乙個,則其它的幾個版本將被隱藏,派生類物件將無法使用它們。

C 虛函式與虛函式的工作原理

虛函式的工作原理 獲取物件的虛函式表位址 給類函式宣告virtual關鍵字,將該函式解釋為虛函式。基類定義的虛函式表明子類可以繼承並實現該虛函式。虛函式的最大作用為 可以通過基類指標或引用來接收乙個子類指標或者引用,並通過基類指標或引用來呼叫虛函式來實現相同的動作不同的實現方式,達到多型的目的。例子...

C 學習筆記5 虛函式的工作原理

ps 編譯器對虛方法使用動態聯編,執行時根據物件決定呼叫父類還是子類的這個方法。虛函式的工作原理是 基類的物件維護乙個虛函式表,所謂的維護,方式是用乙個隱藏指標指向虛函式表。這個虛函式表中記錄基類中定義的虛函式的函式位址。同樣,派生類的物件也維護這樣乙個虛函式表。不同的是,1 如果派生類並沒有重新實...

C 虛函式原理

簡單地說,每乙個含有虛函式 無論是其本身的,還是繼承而來的 的類都至少有乙個與之對應的虛函式表,其中存放著該類所有的虛函式對應的函式指標。例 其中 從編譯器的角度來說,b的虛函式表很好構造,d的虛函式表構造過程相對複雜。下面給出了構造d的虛函式表的一種方式 僅供參考 以下面的程式為例 編譯器只知道p...