1. 程式人生 > >關於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++類有著兩個重要的方面:用於描述行為的公共介面,以及行為的私有實現。
       大多數的繼承都是公有繼承:派生類繼承了基類的介面和實現。不過,我們也可以進行有選擇的繼承,即派生類可以只繼承介面或實現。私有基類,只繼承實實現,沒有介面;公有繼承基類,繼承介面,但繼承的實現可能是不完整的或不存在的(純虛擬函式)。