C++中的接口與實現

C++中的接口與實現

        所謂接口繼承,就是派生類只繼承函數的接口,也就是聲明;而實現繼承,就是派生類同時繼承函數的接口和實現。
       我們都很清楚C++中有幾個基本的概念,虛函數、純虛函數、非虛函數。
       虛函數
       C++實現運行中的多態性是通過虛函數實現的,而虛函數必須存在於繼承環境下。
       因此,虛函數是指一個類中你希望進行重載的成員函數,當你用一個基類指針或引用指向一個繼承類對象的時候,你調用一個虛函數,實際調用的是繼承類的成員函數。虛函數用來表現基類和派生類的成員函數之間的一種關係。虛函數的定義在基類中進行,在需要定義爲虛函數的成員函數的聲明前冠以關鍵字,如 virtual void func() 。 基類中的某個成員函數被聲明爲虛函數後,此虛函數就可以在一個或多個派生類中被重新定義. 在派生類中重新定義時,其函數原型,包括返回類型、函數名、參數個數、參數類型及參數的先後順序,都必須與基類中的原型完全相同。
        虛函數是重載的一種表現形式,是一種動態的重載方式。
       只有類的普通成員函數可以定義爲虛函數,全局函數及靜態成員函數(類擁有)不能聲明爲虛函數。
       純虛函數:
        純虛函數在基類中沒有定義且只能在基類中定義,但未給出具體的函數定義體(實現),它們被初始化爲0。任何用純虛函數派生的類,都要自己提供該函數的具體實現。
         定義純虛函數:virtual void func() = 0;
         定義了純虛函數的類被稱之爲抽象類。抽象類定義一族派生類的共同接口,而接口的完整實現,即純虛函數的函數體,由派生類自己定義。
例://class Shape
       public:
                 virtual void area()=0; // 純虛函數
        //class Tringle : public Shape  //公有繼承
       public:
                void area() {//}                /接口與實現
         抽象類可以有多個純虛函數,也可以定義其他虛函數。若派生類沒有重新定義純虛函數,那麼該派生類也稱之爲純虛函數。
         純虛函不需要定義其實際操作,它的存在只是爲了在派生類中被重新定義,只是提供一個多態接口
       非虛函數
       一般成員函數,無virtual關鍵字修飾。
        至於爲什麼要定義這些函數,我們可以將虛函數、純虛函數和非虛函數的功能與接口繼承實現繼承聯繫起來:
         如前所述,聲明一個純虛函數(pure virtual)的目的是爲了讓派生類只繼承函數接口,也就是上面說的接口繼承。
        純虛函數一般是在不方便具體實現此函數的情況下使用。也就是說基類無法爲繼承類規定一個統一的缺省操作,但繼承類又必須含有這個函數接口,並對其分別實現。但是,在C++中,我們是可以爲純虛函數提供定義的,只不過這種定義對繼承類來說沒有特定的意義。因爲繼承類仍然要根據各自需要實現函數。
        通俗說,純虛函數就是要求其繼承類必須含有該函數接口,並對其進行實現。是對繼承類的一種接口實現要求,但並不提供缺省操作,各個繼承類必須分別實現自己的操作。
        聲明非純虛函數(impure virtual)的目的是讓繼承類繼承該函數的接口和缺省實現。
        與純虛函數唯一的不同就是其爲繼承類提供了缺省操作,繼承類可以不實現自己的操作而採用基類提供的默認操作。
        聲明非虛函數(non-virtual)的目的是爲了令繼承類繼承函數接口及一份強制性實現。
        相對於虛函數來說,非虛函數對繼承類要求的更爲嚴格,繼承類不僅要繼承函數接口,而且也要繼承函數實現。也就是爲繼承類定義了一種行爲。
 總結
        純虛函數:要求繼承類必須含有某個接口,並對接口函數實現。
        虛函數:繼承類必須含有某個接口,可以自己實現,也可以不實現,而採用基類定義的缺省實現。
        非虛函數:繼承類必須含有某個接口,必須使用基類的實現。
         一個C++類有着兩個重要的方面:用於描述行爲的公共接口,以及行爲的私有實現。
       大多數的繼承都是公有繼承:派生類繼承了基類的接口和實現。不過,我們也可以進行有選擇的繼承,即派生類可以只繼承接口或實現。私有基類,只繼承實實現,沒有接口;公有繼承基類,繼承接口,但繼承的實現可能是不完整的或不存在的(純虛函數)。
 例:
我們可以用函數:
 Triangle t;
 t.area();
我們只是使用了其接口,但具體的實現可以不知道。void area() {......} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章