1、純虛函式
強制子類實現介面
c++中包含純虛函式的類,被稱為是「抽象類」。抽象類不能使用new出物件,只有實現了這個純虛函式的子類才能new出物件。
c++中的純虛函式更像是「只提供申明,沒有實現」,是對子類的約束,是「介面繼承」。
c++中的純虛函式也是一種「執行時多型」。
如下面的類包含純虛函式,就是「抽象類」:
2、非純虛函式(impure virtual)
允許子類重寫
宣告一般(非純)虛函式的目的是讓派生類繼承函式的介面和預設行為。
c++的虛函式主要作用是「執行時多型」,父類中提供虛函式的實現,為子類提供預設的函式實現。
子類可以重寫父類的虛函式實現子類的特殊化。
有時,我們希望基類提供的預設行為只能被派生類「顯式」的繼承,即在派生類不重新定義函式的時候,不繼承預設行為。兩種方法:
1.將基類函式宣告為純虛函式,將預設行為宣告為protected非虛函式,則派生類必須重新宣告他,並且可以在函式中使用表示預設行為的函式。此時,函式的介面與預設行為用不同的函式表示,會有一些雷同名稱的函式。
2.將基類函式宣告為純虛函式,並為其提供乙個定義,派生類中必須宣告函式,若不提供定義,則繼承基類的定義作為預設行為。此時,將預設行為也置於public中。
3、非虛函式
子類必須繼承
宣告非虛函式的目的是讓派生類繼承函式的介面和實現。
因此,不要將所有函式都宣告為非虛函式,除非他確實不會作為基類。通常也不要將成員函式都宣告為虛函式,尤其是函式不需要再派生類中重新定義時。
繼承介面和實現, 主要包含三種方式:
1. 只繼承介面, 純虛函式;
2. 繼承介面和實現, 允許覆寫(override), 虛函式;
3. 繼承介面和實現, 不允許覆寫(override), 非虛函式;
1. 純虛函式:
只繼承介面, 但是派生類必須實現其介面;
純虛函式也可以包含實現, 但是只能在指明類(即, class::)的時候使用
2. 虛函式:
繼承介面和實現, 派生類可以覆寫(override), 也可以使用預設版本, 即基函式(base)版本;
純虛函式約束程式更多, 虛函式更靈活;
3. 非虛函式
繼承介面和實現, 強制的提供派生類的實現, 不可以改變, 即不可以覆寫(override);
關於派生類使用純虛函式的實現, 如下:
虛函式(簡樸的impure virtual函式)背後的故事和純虛函式(pure virtual函式)有點不同,一如往常,派生類繼承其函式介面,但虛函式(簡樸的impure virtual函式)會提供乙份實現**,派生類可能覆寫(override)它,所以結論是:
1、宣告虛函式(簡樸的impure virtual函式)的目的是讓派生類繼承該函式的介面和預設實現,考慮error函式,其介面表示,每個類都必須支援乙個「當遇上錯誤是可呼叫」的函式,但每個類可自由處理錯誤,若某個類不想針對錯誤做出任何特殊行為,它可以退回到shape類提供的預設錯誤處理行為。
但是允許虛函式(簡樸的impure virtual函式)同時指定函式宣告和函式預設行為,卻有可能造成危險
C 繼承方式
簡單地說下c 類的3種繼承方式,分別是public繼承,protected繼承,private繼承。最常用的還是public繼承。class預設的是private繼承,它的member如果沒寫許可權也是預設 private。struct則相反,預設的是public繼承。結合下面的圖示和 對c 的繼承...
C 繼承方式
公共繼承保護繼承私有繼承 class b public a 公有繼承的特點是 基類public 為派生類的public 基類protected 為派生類的protected 基類private 不能被派生類訪問 class b protected a 保護繼承的特點是 基類public 為派生類的p...
C 繼承方式
class 派生類名 繼承方式 基類名 繼承方式限定了基類成員在派生類中的訪問許可權,包括 public 公有的 private 私有的 和 protected 受保護的 此項是可選項,如果不寫,預設為 private 成員變數和成員函式預設也是 private 類成員的訪問許可權由高到低依次為 p...