C++接口繼承與實現繼承的區別

轉載:https://blog.csdn.net/ljinddlj/article/details/1922189  

                     接口繼承與實現繼承的區別

 

       所謂接口繼承,就是派生類只繼承函數的接口,也就是聲明;而實現繼承,就是派生類同時繼承函數的接口和實現。

我們都很清楚C++中有幾個基本的概念,虛函數、純虛函數、非虛函數。

 

虛函數:

虛函數是指一個類中你希望重載的成員函數,當你用一個基類指針或引用指向一個繼承類對象的時候,你調用一個虛函數,實際調用的是繼承類的版本。——MSDN

虛函數用來表現基類和派生類的成員函數之間的一種關係. 
虛函數的定義在基類中進行,在需要定義爲虛函數的成員函數的聲明前冠以關鍵字 virtual. 
基類中的某個成員函數被聲明爲虛函數後,此虛函數就可以在一個或多個派生類中被重新定義. 
在派生類中重新定義時,其函數原型,包括返回類型,函數名,參數個數,參數類型及參數的先後順序,都必須與基類中的原型完全相同. 
虛函數是重載的一種表現形式,是一種動態的重載方式.

 

純虛函數:

純虛函數在基類中沒有定義,它們被初始化爲0。 
任何用純虛函數派生的類,都要自己提供該函數的具體實現。 
定義純虛函數 
virtual void fun(void) = 0;

非虛函數:

一般成員函數,無virtual關鍵字修飾。

 

至於爲什麼要定義這些函數,我們可以將虛函數、純虛函數和非虛函數的功能與接口繼承與實現繼承聯繫起來:

聲明一個純虛函數(pure virtual)的目的是爲了讓派生類只繼承函數接口,也就是上面說的接口繼承。

純虛函數一般是在不方便具體實現此函數的情況下使用。也就是說基類無法爲繼承類規定一個統一的缺省操作,但繼承類又必須含有這個函數接口,並對其分別實現。但是,在C++中,我們是可以爲純虛函數提供定義的,只不過這種定義對繼承類來說沒有特定的意義。因爲繼承類仍然要根據各自需要實現函數。

通俗說,純虛函數就是要求其繼承類必須含有該函數接口,並對其進行實現。是對繼承類的一種接口實現要求,但並不提供缺省操作,各個繼承類必須分別實現自己的操作。

聲明非純虛函數(impure virtual)的目的是讓繼承類繼承該函數的接口和缺省實現。

與純虛函數唯一的不同就是其爲繼承類提供了缺省操作,繼承類可以不實現自己的操作而採用基類提供的默認操作。

聲明非虛函數(non-virtual)的目的是爲了令繼承類繼承函數接口及一份強制性實現。

相對於虛函數來說,非虛函數對繼承類要求的更爲嚴格,繼承類不僅要繼承函數接口,而且也要繼承函數實現。也就是爲繼承類定義了一種行爲。

 

總結:

純虛函數:要求繼承類必須含有某個接口,並對接口函數實現。

虛函數:繼承類必須含有某個接口,可以自己實現,也可以不實現,而採用基類定義的缺省實現。

非虛函數:繼承類必須含有某個接口,必須使用基類的實現。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章