C 中的介面繼承和實現繼承

2021-07-11 06:53:24 字數 2003 閱讀 8972

c++中的繼承基於乙個事實:父類定義的成員函式會一直被子類繼承(包括被子類隱藏的部分)。

而父類中提供的函式可以有三種: 1)純虛函式,2)普通虛函式 ,3)普通成員函式。這三種函式型別代表了三種繼承設計模式。

乙個簡單的例項**如下:

class shape ;

class rectangle: public shape ;

class ellipse: public shape ;

純虛函式draw使得shape成為乙個抽象類。所以,使用者不能建立shape類的例項,只能建立它的派生類的例項。

shape類中宣告了三個函式。第乙個函式draw,在某一畫面上繪製當前物件。第二個函式error,被其它成員函式呼叫,用於報告出錯資訊。第三個函式objectid,返回當前物件的乙個唯一整數識別符號。每個函式以不同的方式宣告:draw是乙個純虛函式;error是乙個簡單的(非純)虛函式;objectid是乙個非虛函式。這些不同的宣告各有什麼含義呢?

首先看純虛函式draw。純虛函式最顯著的特徵是:它們必須在繼承了它們的任何具體類中重新宣告,而且它們在抽象類中往往沒有定義。從而可知:定義純虛函式的目的在於,使派生類僅僅只是繼承函式的介面。!!!

這對shape::draw函式來說非常有意義,因為,讓所有shape物件都可以被繪製是很合理,但shape類無法為shape::draw提供乙個合理的預設實現。例如,繪製橢園的演算法就和繪製矩形的演算法大不一樣。打個比方來說,上面shape::draw的宣告就象是在告訴子類的設計者,「你必須提供乙個draw函式,但我不知道你會怎樣實現它。」

簡單虛函式的情況和純虛函式有點不一樣。照例,派生類繼承了函式的介面,但簡單虛函式一般還提供了實現,派生類可以選擇改寫它們或不改寫它們。!!!

宣告簡單虛函式的目的在於,使派生類繼承函式的介面和預設實現。!!!

具體到shape::error,這個介面是在說,每個類必須提供乙個出錯時可以被呼叫的函式,但每個類可以按它們認為合適的任何方式處理錯誤。如果某個類不想做什麼特別的事,可以借助於shape類中提供的預設出錯處理函式。也就是說,shape::error的宣告是在告訴子類的設計者,「你必須支援error函式,但如果你不想寫自己的版本,可以借助shape類中的預設版本。」

最後,來談談shape的非虛函式(普通成員函式),objectid。當乙個成員函式為非虛函式時,它在派生類中的行為就不應該不同。實際上,非虛成員函式表明了一種特殊性上的不變性,因為它表示的是不會改變的行為—- 不管乙個派生類有多特殊。所以:

宣告非虛函式的目的在於,使派生類繼承函式的介面和強制性實現。!!!

也即是,非虛函式由父類宣告且實現,子類應繼承介面以及強制性的實現。

可以認為,shape::objectid的宣告就是在說,」每個shape物件有乙個函式用來產生物件的識別符號,並且物件識別符號的產生方式總是一樣的。這種方式由shape::objectid的定義決定,派生類不能改變它。」因為非虛函式表示一種特殊性上的不變性,所以它決不能在子類中重新定義。

理解了純虛函式、簡單虛函式和非虛函式在宣告上的區別,就可以精確地指定你想讓派生類繼承什麼:僅僅是介面,還是介面和乙個預設實現?或者,介面和乙個強制實現?

純虛函式代表的就是介面繼承。其他兩種代表實現繼承

(1)純虛函式:要求繼承類必須含有某個介面,並對介面函式實現。

(2)虛函式:繼承類必須含有某個介面,可以自己實現,也可以不實現,而採用基類定義的預設實現。

(3)非虛函式:繼承類必須含有某個介面,必須使用基類的實現。

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

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

C 介面繼承與實現繼承

介面繼承與實現繼承 moakap 所謂介面繼承,就是派生類只繼承函式的介面,也就是宣告 而實現繼承,就是派生類同時繼承函式的介面和實現。我們都很清楚c 中有幾個基本的概念,虛函式 純虛函式 非虛函式。虛函式 虛函式是指乙個類中你希望過載的成員函式,當你用乙個基類指標或引用指向乙個繼承類物件的時候,你...

c 介面繼承與實現繼承

所謂介面繼承,就是派生類只繼承函式的介面,也就是宣告 而實現繼承,就是派生類同時繼承函式的介面和實現。我們都很清楚c 中有幾個基本的概念,虛函式 純虛函式 非虛函式。虛函式 虛函式是指乙個類中你希望過載的成員函式,當你用乙個基類指標或引用指向乙個繼承類物件的時候,你呼叫乙個虛函式,實際呼叫的是繼承類...