34區分介面繼承和實現繼承

2022-08-20 06:39:07 字數 1259 閱讀 3470

函式介面繼承與函式實現繼承,在public繼承之下,derived classes總是繼承base class的介面。

作為class的設計者:

1.有時我們希望derived classes只繼承成員函式的介面(宣告);

2.有時我們會希望derived classes同時繼承函式的介面與實現,但是又希望能夠覆寫(override)它們所繼承的實現;

3.有時我們希望derived classes同時繼承函式的介面與實現,但是不允許覆寫任何東西。

class

shape;

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...