c 之多型篇(上)

2021-07-30 08:02:11 字數 2854 閱讀 9157

物件型別:

多型:是指向不同的物件傳送同乙個訊息,不同物件對應同一訊息產生不同行為。在程式中訊息就是呼叫函式,不同的行為就是指不同的實現方法,即執行不同的函式體。也可以這樣說就是實現了「乙個介面,多種方法」。

靜態多型:程式編譯時確定具體的工作

編譯器在編譯期間完成的,編譯器根據函式實參的型別(可能會進行隱式型別轉換),可推 斷出要呼叫那個函式,如果有對應的函式就呼叫該函式,否則出現編譯錯誤。

例如:

#include using namespace std;

int add(int left,int right)

float add(float left,float right)

int main()

實現多型

,通過指向派生類的基類

指標或引用,訪問派生類中同名覆蓋

成員函式

所以,動態繫結的條件就是:

1.必須是虛函式。

2.通過基類型別的引用或指標來呼叫虛函式。

舉個例子說明下虛函式:

class cbase

void funtest2(int _itest)

virtual void funtest3(int _itest1)

virtual void funtest4( int _itest)

};class cderived :public cbase

virtual void funtest2(int _itest)

void funtest3(int _itest1)

virtual void funtest4(int _itest1,int _itest2)

分析結果:

總結:要實現多型,在基類的成員函式前一定要加上virtual關鍵字,構成虛函式。

派生類的中對基類的虛函式重寫時,可以加virtual關鍵字,也可以不加。但是,必須保證與基類                              的虛函式的函式名,返回值,形參必須保持一致。

注意:以下函式不可以作為虛函式。

1.建構函式。

原因:建構函式是用來建立物件的。虛函式對應乙個指向虛函式表的虛表指標,這個指標是儲存在物件的記憶體空間裡的。如果建構函式是虛函式,那麼就需要通過虛表指標來呼叫,可是,都沒有建立物件,那如何來呼叫呢?所以,建構函式不能是虛函式。

2.static修飾的成員函式。 原因

:static修飾的成員函式是屬於乙個類的,而不是屬於某個物件。

3.友元函式。

原因:只有成員函式可以是虛函式。友元函式不屬於類的成員函式。

賦值函式比較特殊,可以作為虛函式,但不建議使用。

原因:賦值運算子的形參是同類的型別,也就是說大部分都是同型別進行賦值。所以設為虛函式是沒有意義的。

借鑑與:

析構函式。

類中有虛函式,或者占用資源的,最好用虛函式。

測試**:

基類,派生類析構函式為虛函式。

class b

{ public:

virtual ~b()

{ cout<

結果:

基類,派生類析構函式不是虛函式。

class b

{ public:

~b()

{ cout<

結果:

總結幾點:

1.派生類重寫基類的虛函式實現多型,要求函式名、引數列表、返回值完全相同。(協變除外) 

協變:返回值為基類或派生類的引用,指標。

2.基類中定義了虛函式,在派生類中該函式始終保持虛函式的特性。 

3.只有類的非靜態成員函式才能定義為虛函式,靜態成員函式不能定義為虛函式。 

4.如果在類外定義虛函式,只能在宣告函式時加virtual關鍵字,定義時不用加。 

5.建構函式不能定義為虛函式,雖然可以將operator=定義為虛函式,但最好不要這麼做,使用時容 易混淆 

6.不要在建構函式和析構函式中呼叫虛函式,在建構函式和析構函式中,物件是不完整的,可能會 出現未定義的         行為。

7.最好將基類的析構函式宣告為虛函式。(析構函式比較特殊,因為派生類的析構函式跟基類的析構 函式名稱不一       樣,但是構成覆蓋,這裡編譯器做了特殊處理) 

8.虛表是所有類物件例項共用的(有關虛表見下篇部落格。)

C 之多型篇

我的一點小想法 virtual只需要加在父類裡邊 析構函式和同名成員函式 就好,不過在子類的同名函式加上 virtual 是為了養成好的 書寫習慣。析構函式前邊加是為了防止沒有釋放子類物件的記憶體導致記憶體洩露,同名成員函式前加是為了父類例項化的物件指標能夠指向子類資料成員。這樣基本包含了所有的點了...

c 之多型篇(下) 虛表,多型呼叫

定義 在成員函式的形參列表後面寫上 0,則成員函式為純虛函式。包含純虛函式的類叫做抽象類 也叫介面類 抽象類不能例項化出物件。純虛函式 在派生類中重新定義以後,派生類才能例項化出物件。測試 class base 抽象類 class dervied public base 測試 class base ...

C 學習之多型

多型性是物件導向程式設計中的乙個重要特徵,利用多型性可以設計和實現乙個易於拓展的系統。在c 語言中,多型性是指具有不同功能的函式可以用同乙個函式名,這樣就可以用乙個函式名呼叫不同內容的函式,發出同樣的訊息被不同型別的物件接收時,導致完全不同的行為。多型性通過聯編實現。聯編是指乙個電腦程式自身彼此關聯...