函式介面繼承與函式實現繼承,在public繼承之下,derived classes總是繼承base class的介面。
作為class的設計者:
1.有時我們希望derived classes只繼承成員函式的介面(宣告);
2.有時我們會希望derived classes同時繼承函式的介面與實現,但是又希望能夠覆寫(override)它們所繼承的實現;
3.有時我們希望derived classes同時繼承函式的介面與實現,但是不允許覆寫任何東西。
classshape;
class rectangle :public shape;
public繼承導致的is-a關係,導致成員函式的介面總會被繼承。
在基類中三種不同的函式宣告方式:
1.宣告乙個pure virtual函式的目的是為了讓derived classes只繼承函式介面
2.宣告impure virtual 函式的目的是為了讓derived classes繼承該函式的介面與預設實現。
其介面表示每個class都必須支援乙個「當遇上錯誤時可呼叫的函式」,但是每個class可自由的處理錯誤。如果某個class不想針對錯誤做出特殊行為,它可以退回到shape class提供的預設錯誤行為。
3.如果成員函式是個non-virtual函式,意味著它並不打算在derived classes中有不同行為。宣告non-virtual函式的目的是為了令derived classes繼承函式的介面及乙份強制性實現。
shape::objectid的宣告是讓每個shape物件都有乙個用來產生物件識別碼的函式,此識別碼總是採用相同的計算方法,此方法
由shape::objectid的定義式決定,任何派生類都不應該嘗試改變其行為。
pure virtual函式、impure virtual 函式、non-virtual函式之間的差異,使得你得以精確指定你想要derived classes繼承的東西:只繼承介面、或是繼承介面和乙份預設實現
、或是繼承介面和乙份強制實現。
經驗不足的class設計者常會犯下以下兩個錯誤:
virtual函式的成本:
乙個典型的程式有%80的執行時間花費在%20的**上,這個法則十分重要。
1.將所有的函式宣告為non-virtual,這使得derived classes沒有剩餘的空間進行特化工作。這種是不變性凌駕於特異性
2.將所有的成員函式宣告為virtual。例如介面類。 這種是特異性凌駕於不變性
34區分介面繼承和實現繼承
宣告 pure virtual 函式的目的是為了讓derived class 只繼承函式介面,具體實現須在derived class 中完成 宣告impure virtual 函式的目的是為了讓 derived class 繼承該函式的介面和預設實現,通過呼叫可在此預設實現基礎上新增新的 宣告non...
條款34 區分介面繼承和實現繼承
作為乙個 class 的設計者 1 有的時候你想要 derived classes 只繼承乙個 member function 的 inte ce declaration 宣告乙個 pure virtual function的目的是使 derived classes 繼承乙個函式 inte ce o...
C Item34 區分介面繼承和實現繼承
區分介面繼承和實現繼承 類包含的成員函式種類 1.靜態函式 2.非靜態函式 2.1 普通函式 非虛 non virtual 2.2 虛函式 2.2.1 純虛函式 pure virtual 2.2.2 非純虛函式 impure virtual 一 介面繼承 繼承類必須要實現宣告為pure virtua...