介面繼承與實現繼承

2021-07-09 14:00:17 字數 1041 閱讀 5883

繼承可以從兩方面理解:

1介面繼承,只繼承函式的介面(宣告),需要在派生類中定義繼承過來的純虛函式。

2實現繼承,同時繼承介面與實現,可以重新定義繼承的函式,也可以不重新定義。另外還有:子類不能重新定義繼承的函式,這類函式就是普通的函式,非虛函式。

class animal {

public:

virtual void attack()=0;

virtual void getclass() {

cout<<"animal"<

介面繼承:

比如上面兩個類,animal類attack函式是純虛函式,這使得animal是乙個抽象類,無法例項化(即使為純虛函式提供了定義也一樣不能例項化)。對於動物種類有很多種,但是我們不知道他們的攻擊方式比如抓、咬、毒液、**等等。在定義animal類的時候,我們並不知道應該如何來實現attack函式,所以將它宣告為純虛函式,由派生類來定義,即告訴子類」你必須提供乙個attack函式,但我不知道你怎麼去實現它「,定義純虛函式的目的就是子類只繼承函式的介面。

有時候宣告乙個只含有純虛函式的類很有用,這種類稱為協議類(protocol class),他只為子類提供介面,完全不提供實現。

實現繼承:

普通的虛函式和純虛函式不一樣,普通的虛函式一般提供了函式的實現,所以子類繼承了函式的介面以及實現。但是子類可以選擇重新定義或不定義這個函式而是用預設實現。即告訴子類」你可以重新定義這個虛函式,或者使用預設實現「。比如上面的getclass函式,可以重新定義,具體輸出某個動物類別,也可以預設實現而輸出animal這個大類。

有了純虛函式、簡單虛函式和非虛函式,就可以決定子類繼承哪種:僅介面繼承、介面繼承和預設實現、介面繼承和強制實現

兩種極端:

1全都宣告為非虛函式,這個問題從虛析構函式的必要性就可以看出,但是如果乙個類永遠不會作為基類,這麼做也沒錯。

2全都宣告為虛函式,有時這沒問題,比如協議類就是這樣的例子,但全是虛函式就代表派生類可以利用它來做任何事,這有時也會帶來問題。

所以宣告時應該慎重選擇成員函式的種類。

介面繼承與實現繼承

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

介面繼承與實現繼承

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

介面繼承與實現繼承

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