轉載自:
https://blog.csdn.net/ljinddlj/article/details/1922189
接口繼承與實現繼承
MoaKap
所謂接口繼承,就是派生類只繼承函數的接口,也就是聲明;而實現繼承,就是派生類同時繼承函數的接口和實現。
我們都很清楚C++中有幾個基本的概念,虛函數、純虛函數、非虛函數。
虛函數:
虛函數是指一個類中你希望重載的成員函數,當你用一個基類指針或引用指向一個繼承類對象的時候,你調用一個虛函數,實際調用的是繼承類的版本。——MSDN
虛函數用來表現基類和派生類的成員函數之間的一種關系.
虛函數的定義在基類中進行,在需要定義為虛函數的成員函數的聲明前冠以關鍵字 virtual.
基類中的某個成員函數被聲明為虛函數后,此虛函數就可以在一個或多個派生類中被重新定義.
在派生類中重新定義時,其函數原型,包括返回類型,函數名,參數個數,參數類型及參數的先后順序,都必須與基類中的原型完全相同.
虛函數是重載的一種表現形式,是一種動態的重載方式.
純虛函數:
純虛函數在基類中沒有定義,它們被初始化為0。
任何用純虛函數派生的類,都要自己提供該函數的具體實現。
定義純虛函數
virtual void fun(void) = 0;
任何用純虛函數派生的類,都要自己提供該函數的具體實現。
定義純虛函數
virtual void fun(void) = 0;
非虛函數:
一般成員函數,無virtual關鍵字修飾。
至於為什么要定義這些函數,我們可以將虛函數、純虛函數和非虛函數的功能與接口繼承與實現繼承聯系起來:
聲明一個純虛函數(pure virtual)的目的是為了讓派生類只繼承函數接口,也就是上面說的接口繼承。
純虛函數一般是在不方便具體實現此函數的情況下使用。也就是說基類無法為繼承類規定一個統一的缺省操作,但繼承類又必須含有這個函數接口,並對其分別實現。但是,在C++中,我們是可以為純虛函數提供定義的,只不過這種定義對繼承類來說沒有特定的意義。因為繼承類仍然要根據各自需要實現函數。
通俗說,純虛函數就是要求其繼承類必須含有該函數接口,並對其進行實現。是對繼承類的一種接口實現要求,但並不提供缺省操作,各個繼承類必須分別實現自己的操作。
聲明非純虛函數(impure virtual)的目的是讓繼承類繼承該函數的接口和缺省實現。
與純虛函數唯一的不同就是其為繼承類提供了缺省操作,繼承類可以不實現自己的操作而采用基類提供的默認操作。
聲明非虛函數(non-virtual)的目的是為了令繼承類繼承函數接口及一份強制性實現。
相對於虛函數來說,非虛函數對繼承類要求的更為嚴格,繼承類不僅要繼承函數接口,而且也要繼承函數實現。也就是為繼承類定義了一種行為。
總結:
純虛函數:要求繼承類必須含有某個接口,並對接口函數實現。
虛函數:繼承類必須含有某個接口,可以自己實現,也可以不實現,而采用基類定義的缺省實現。
非虛函數:繼承類必須含有某個接口,必須使用基類的實現。
評論;
-
虛函數在派生類中重新定義時候,如果返回的是對基類型的引用或是指針,那么派生類的虛函數可以返回基類函數返回類型的派生類引用或指針,而不是一定要求一樣的,primer上看到的,