虛函式對於多型具有決定性的作用,有虛函式才能構成多型,這節我們來重點說一下虛函式的注意事項。1) 只需要在虛函式的宣告處加上 virtual 關鍵字,函式定義處可以加也可以不加。2) 為了方便,你可以只將基類中的函式宣告為虛函式,這樣所有派生類中具有遮蔽(覆蓋)關係的同名函式都將自動成為虛函式。關於名字遮蔽已在《c++繼承時的名字遮蔽》一節中進行了講解。3) 當在基類中定義了虛函式時,如果派生類沒有定義新的函式來遮蔽此函式,那麼將使用基類的虛函式。4) 只有派生類的虛函式遮蔽基類的虛函式(函式原型相同)才能構成多型(通過基類指標訪問派生類函式)。例如基類虛函式的原型為virtual void func();
,派生類虛函式的原型為virtual void func(int);
,那麼當基類指標 p 指向派生類物件時,語句p -> func(100);
將會出錯,而語句p -> func();
將呼叫基類的函式。5) 建構函式不能是虛函式。對於基類的建構函式,它僅僅是在派生類建構函式中被呼叫,這種機制不同於繼承。也就是說,派生類不繼承基類的建構函式,將建構函式宣告為虛函式沒有什麼意義。6) 析構函式可以宣告為虛函式,而且有時候必須要宣告為虛函式,這點我們將在下節中講解。
站在「學院派」的角度講,封裝、繼承和多型是物件導向的三大特徵,封裝、繼承分別在《c++類成員的訪問許可權》《c++繼承與派生》中進行了講解,而多型是指通過基類的指標既可以訪問基類的成員,也可以訪問派生類的成員。下面是構成多型的條件:
在基類 base 中我們將void func()
宣告為虛函式,這樣派生類 derived 中的void func()
就會自動成為虛函式。p 是基類 base 的指標,但是指向了派生類 derived 的物件。語句p -> func();
呼叫的是派生類的虛函式,構成了多型。語句p -> func(10);
呼叫的是基類的虛函式,因為派生類中沒有函式遮蔽它。語句p -> func("");
出現編譯錯誤,因為通過基類的指標只能訪問從基類繼承過去的成員,不能訪問派生類新增的成員。
首先看成員函式所在的類是否會作為基類。然後看成員函式在類的繼承後有無可能被更改功能,如果希望更改其功能的,一般應該將它宣告為虛函式。如果成員函式在類被繼承後功能不需修改,或派生類用不到該函式,則不要把它宣告為虛函式。
C 虛函式和虛函式表詳解
在講解虛函式之前需要先區分一下以下定義 過載,重寫,重定義 過載 同乙個類中函式名相同,函式的引數列表不相同的兩個及兩個以上的函式就是函式過載。注意 函式的返回值不能作為函式是否過載的依據。重寫 是在子類繼承父類的時候,對父類的虛函式進行了覆蓋。重寫會使程式發生動態聯編,產生多型。重定義 是在子類繼...
C 虛函式及虛函式表詳解
多型 的關鍵在於通過基類指標或引用呼叫乙個虛函式時,編譯時不確定到底呼叫的是基類還是派生類的函式,執行時才確定。include using namespace std class a virtual void func2 class b public a int main 在 32 位編譯模式下,程...
C 之虛函式(一)純虛函式詳解
有時在基類中將某一成員函式定為虛函式,並不是基類本身的要求,而是考慮到派生類的需要,在基類中預留了乙個函式名,具體功能留給派生類根據需要去定義。例如在前邊的例12.1 詳情請檢視 什麼是c 虛函式 程式中,基類point中沒有求面積的area函式,因為 點 是沒有面積的,也就是說,基類本身不需要這個...