C 中的介面與實現

2021-08-07 05:14:58 字數 2135 閱讀 4186

所謂介面繼承,就是派生類只繼承函式的介面,也就是宣告;而實現繼承,就是派生類同時繼承函式的介面和實現。

我們都很清楚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++類有著兩個重要的方面:用於描述行為的公共介面,以及行為的私有實現。

大多數的繼承都是公有繼承:派生類繼承了基類的介面和實現。不過,我們也可以進行有選擇的繼承,即派生類可以只繼承介面或實現。私有基類,只繼承實實現,沒有介面;公有繼承基類,繼承介面,但繼承的實現可能是不完整的或不存在的(純虛函式)。

例:我們可以用函式:

******** t;

t.area();

我們只是使用了其介面,但具體的實現可以不知道。void area()  

C 介面與實現

公有繼承 inte ce and implementation 三種繼承的方式 pure virtual function 只繼承基類的介面,要在派生類中重寫該函式的實現。至於是在子類中實現還是子類的子類中實現都無所謂,關鍵是需要例項化的類就需要實現,不然物件是無法建立的。virtual funct...

c 介面與實現的分離

由於c 沒有明確的將介面和實現分離,檔案之間的編譯依賴關係很大,如果有乙個檔案 發生變化,則可能影響其他檔案,乃至整個專案。因此,將物件實現細目隱藏於乙個指標背後的目的,我們可以設計乙個介面類。乙個實現類,負責介面的實現。如下 class personimpl class date class ad...

C 中的介面實現多型

我們都知道虛方法實現多型,抽象方法實現多型等,我們今天來看看如何使用介面實現多型 1.首先我們先要來了解了解什麼是介面,它存在的意識 01.介面就是為了約束方法的格式 引數和返回值型別 而存在的 02.介面可以實現多繼承,彌補單繼承的缺陷。03.介面可以看成是乙個特殊的抽象類,通過反編譯看原始碼可知...