所謂的虛函式,就是那些被virtual關鍵字所修飾的類成員函式。
抽象基類:
純虛函式是基類中宣告的虛函式,它在基類中沒有定義,但是要求任何派生類都要定義自己的實現方法。
在基類中實現純虛函式的方法是在函式原型後加上「=0」,例如:
virtual
void
func()=0;
如果乙個函式在基類中被宣告為virtual,那麼在所有的派生類中它都是virtual,在派生類中virtual函式的重定義通常稱為重寫。
對於晚**:
當使用晚**時,無需檢查物件的型別,只需要檢查物件是否支援特性和方法即可。
為了引發晚**,c++要求在基類中宣告這個函式時使用virtual關鍵字即可。
晚**只對virtual函式起作用,而且只在使用含有virtual函式的基類的位址時發生。
虛函式主要有以下兩個步驟:
每乙個類產生出一堆指向虛函式的指標,放在**中。這個**被稱為virtual table(vtbl)。
每乙個類物件被安插乙個指標,指向相關的virtual table,通常這個指標被稱為vptr。
結構圖如下:
每當建立乙個包含有虛函式的類或從包含有虛函式的類派生乙個類時,編譯器就為這個類建立乙個唯一的vtbl。
如果在這個派生類中沒有對在基類中宣告為virtual的函式進行重新定義,編譯器就使用基類的這個虛函式位址,然後編譯器在這個類中放置vptr。
當使用簡單繼承時,對於每個物件都只有乙個vtbl。vptr必須被初始化為指向相應的vtbl的起始位址。
在繼承的過程中,通常派生類不僅具有基類的特徵,也具有自身的一些特徵。當派生類向上進行型別轉換稱為基類時,就會發生那些自身的特徵被切除,只保留繼承了基類的特徵,這種現象就是物件切片。
C 中的虛函式 純虛函式
c 最重要的特性就是多型,而多型,就主要通過虛函式實現的。具體的實現過程是 基類中的函式定義為虛函式,派生類發生覆蓋 即函式名稱 引數列表 返回值型別完全相同 的情況下,派生類中的函式也會自動變成虛函式,不論加不加virtual關鍵字。此時,基類與子類物件中都會存在一張虛函式表 因為含有虛函式 具體...
C 中的虛函式
c 中的虛函式 virtual function 1.簡介 虛函式是c 中用於實現多型 polymorphism 的機制。核心理念就是通過基類訪問派生類定義的函式。假設我們有下面的類層次 class a class b public a 那麼,在使用的時候,我們可以 a a new b a foo ...
C 中的虛函式
c 中的虛函式 一 雖然很難找到一本不討論多型性的c 書籍或雜誌,但是,大多數這類討論使多型性和c 虛函式的使用看起來很難。我打算在這篇文章中通過從幾個方面和結合一些例子使讀者理解在c 中的虛函式實現技術。說明一點,寫這篇文章只是想和大家交流學習經驗因為本人學識淺薄,難免有一些錯誤和不足,希望大家批...