繼承可以從兩方面理解:
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 中有幾個基本的概念,虛函式 純虛函式 非虛函式。虛函式 虛函式是指乙個類中你希望過載的成員函式,當你用乙個基類指標或引用指向乙個繼承類物件的時候,你呼叫乙個虛函式,實際呼叫的是繼承類...