區分介面繼承和實現繼承

2021-07-14 09:43:46 字數 1467 閱讀 4764

表面上的public繼承概念,其實經過嚴密的嚴查之後,會發現它由兩部分組成:函式介面繼承和函式實現繼承。這兩種繼承的差異,其實就是函式宣告與函式定義之間的差異。

作為class的設計者,有時候你會希望derived class只繼承成員函式的介面(也就是宣告);有時候你又希望derived class同時繼承函式的介面和實現,但又希望能夠覆寫(override)他們所繼承的實現;又有時候你希望derived class同時繼承函式的介面和實現,並且不允許覆寫任何東西。

下面看一段**:

class shape

;class rectangle : public shape {};

class ellipse : public shape {};

shape是個抽象類,它的pure virtual函式draw使它成為乙個抽象class。所以客戶不能建立shape class的實體,只能建立其derived class的實體。儘管如此,shape還是強烈影響了所有以public形式繼承它的derived class。因為:

成員函式的介面總是會被繼承。

pure virtual函式有兩個最突出的特性:它們必須被任何「繼承了它們的」具體class重新宣告,而且他們在抽象class中通常沒有定義,其實就是說:

宣告乙個pure virtual函式的目的是為了讓derived class只繼承函式介面。

不過令人意外的是,我們竟然可以為pure virtual函式提供定義。也就是說你可以為shape::draw**乙份實現**,c++並不會發出怨言,但是,呼叫它的唯一途徑是「呼叫時明確指出其class名稱」:

如下**:

shape* ps = new shape;//shape是抽象類,報錯

shape* ps1 = new rectangle;

ps1->draw();

shape* ps2 = new ellipse;

ps2->draw();

ps1->shape::draw();

ps2->shape::draw();

虛函式和純虛函式有點不同。一如往常,derived class繼承其函式介面,但是虛函式會提供乙份實現**,derived class可能覆寫它,其實就是下面的意思:

宣告虛函式的目的是,讓derived class繼承該函式的介面和預設實現。

最後對於shape的non-virtual 的objectid,如果這個成員函式是個non-virtual 函式,意味著它並不打算在derived class中有不同的行為。宣告乙個non-virtual函式的目的是為了令derived class繼承函式的介面及乙份強制性地實現。

說了這麼多,下面總結一下:pure virtual、****** virtual、non-virtual之間的差異,使得你想要繼承的東西:只繼承介面,或是繼承介面和乙份預設實現,或是繼承介面和乙份強制性的實現。

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

利用public繼承基類,可以將繼承的結果分為兩類 函式介面繼承和函式實現繼承 宣告乙個純函式的目的是為了讓派生類只繼承函式介面 純虛函式有兩個突出的特性 它們必須被任何 繼承了它們 的具體類重新宣告,而且它們在抽象類中通常沒有定義 宣告非純虛函式的目的,是讓派生類繼承該函式的介面和預設實現 宣告非...

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

宣告 pure virtual 函式的目的是為了讓derived class 只繼承函式介面,具體實現須在derived class 中完成 宣告impure virtual 函式的目的是為了讓 derived class 繼承該函式的介面和預設實現,通過呼叫可在此預設實現基礎上新增新的 宣告non...

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

函式介面繼承與函式實現繼承,在public繼承之下,derived classes總是繼承base class的介面。作為class的設計者 1.有時我們希望derived classes只繼承成員函式的介面 宣告 2.有時我們會希望derived classes同時繼承函式的介面與實現,但是又希望...