所謂介面繼承,就是派生類只繼承函式的介面,也就是宣告;而實現繼承,就是派生類同時繼承函式的介面和實現。
我們都很清楚c++中有幾個基本的概念,虛函式、純虛函式、非虛函式。
虛函式:
虛函式是指乙個類中你希望過載的成員函式,當你用乙個基類指標或引用指向乙個繼承類物件的時候,你呼叫乙個虛函式,實際呼叫的是繼承類的版本。——msdn
虛函式用來表現基類和派生類的成員函式之間的一種關係
. 虛函式的定義在基類中進行
,在需要定義為虛函式的成員函式的宣告前冠以關鍵字
virtual.
基類中的某個成員函式被宣告為虛函式後
,此虛函式就可以在乙個或多個派生類中被重新定義
. 在派生類中重新定義時
,其函式原型
,包括返回型別
,函式名
,引數個數
,引數型別及引數的先後順序
,都必須與基類中的原型完全相同
. 虛函式是過載的一種表現形式
,是一種動態的過載方式.
純虛函式:
純虛函式在基類中沒有定義,它們被初始化為0。
任何用純虛函式派生的類,都要自己提供該函式的具體實現。
定義純虛函式
virtual void fun(void) = 0;
非虛函式:
一般成員函式,無virtual關鍵字修飾。
至於為什麼要定義這些函式,我們可以將虛函式、純虛函式和非虛函式的功能與介面繼承與實現繼承聯絡起來:
宣告乙個純虛函式(pure virtual)的目的是為了讓派生類只繼承函式介面,也就是上面說的介面繼承。
純虛函式一般是在不方便具體實現此函式的情況下使用。也就是說基類無法為繼承類規定乙個統一的預設操作,但繼承類又必須含有這個函式介面,並對其分別實現。但是,在c++中,我們是可以為純虛函式提供定義的,只不過這種定義對繼承類來說沒有特定的意義。因為繼承類仍然要根據各自需要實現函式。
通俗說,純虛函式就是要求其繼承類必須含有該函式介面,並對其進行實現。是對繼承類的一種介面實現要求,但並不提供預設操作,各個繼承類必須分別實現自己的操作。
宣告非純虛函式(impure virtual)的目的是讓繼承類繼承該函式的介面和預設實現。
與純虛函式唯一的不同就是其為繼承類提供了預設操作,繼承類可以不實現自己的操作而採用基類提供的預設操作。
宣告非虛函式(
non-virtual
)的目的是為了令繼承類繼承函式介面及乙份強制性實現。
相對於虛函式來說,非虛函式對繼承類要求的更為嚴格,繼承類不僅要繼承函式介面,而且也要繼承函式實現。也就是為繼承類定義了一種行為。
總結:純虛函式:要求繼承類必須含有某個介面,並對介面函式實現。
虛函式:繼承類必須含有某個介面,可以自己實現,也可以不實現,而採用基類定義的預設實現。
非虛函式:繼承類必須含有某個介面,必須使用基類的實現。
介面繼承與實現繼承
所謂介面繼承,就是派生類只繼承函式的介面,也就是宣告 而實現繼承,就是派生類同時繼承函式的介面和實現。我們都很清楚c 中有幾個基本的概念,虛函式 純虛函式 非虛函式。虛函式 虛函式是指乙個類中你希望過載的成員函式,當你用乙個基類指標或引用指向乙個繼承類物件的時候,你呼叫乙個虛函式,實際呼叫的是繼承類...
介面繼承與實現繼承
moakap 所謂介面繼承,就是派生類只繼承函式的介面,也就是宣告 而實現繼承,就是派生類同時繼承函式的介面和實現。我們都很清楚c 中有幾個基本的概念,虛函式 純虛函式 非虛函式。虛函式 虛函式是過載的一種表現形式,是一種動態的過載方式。虛函式是指乙個類中你希望過載的成員函式,當你用乙個基類指標或引...
介面繼承與實現繼承
介面繼承與實現繼承 moakap 所謂介面繼承,就是派生類只繼承函式的介面,也就是宣告 而實現繼承,就是派生類同時繼承函式的介面和實現。我們都很清楚c 中有幾個基本的概念,虛函式 純虛函式 非虛函式。虛函式 虛函式是指乙個類中你希望過載的成員函式,當你用乙個基類指標或引用指向乙個繼承類物件的時候,你...