C 學習之多型

2021-09-30 15:11:04 字數 2143 閱讀 5811

c++的類機制中有支援多型的技術來解決抽象程式設計,它用的是一種滯後**技術,

這種技術,通過預先設定其成員函式的虛函式性質,使得任何**該成員函式的未定型別的物件操作在編譯時,都以乙個不確定的指標特殊地「引命代發」來編碼,

到了執行時,遇到確定型別的物件,才突然制定其真正的行為。即滯後到執行時,根據具體型別的物件來**成員函式,這樣,辨別物件型別的工作就可以不用使用者做了。

虛函式(virtual function)

1.多型條件(polymorphism condition)

使用類程式設計中,要能進行抽象程式設計,不隨類的改動而改動,類機制必須解決這個問題,在c++中,就是虛函式機制。基類與派生類的同名操作。只要標記上virtual,則該操作便具有多型性。

如下**所示:

#include using namespace std;

class base

};class sub : public base

};void test(base& b)

int main()

**輸出如下:

in base class

in sub class

上述**中fun是base類的虛函式,一旦標記了基類的函式為虛函式,則後面繼承類中一切同名成員函式都程式設計了虛函式,在test函式中,b是base類的引用性形參,base類物件和sub類物件都可以作為實參傳給形參b。

如果函式引數是實際複製動作的傳遞,則子類物件完全變成基類物件了,這樣,便不會有多型了。如將上述**中的test函式引數改為如下形式時,

如下**所示:

void test(base b)

int main()

其輸出則變為:

in base class

in base class

因為對於這種引數的傳遞過程已經將物件的性質做了肯定的轉變,而對於確定的物件,是沒有選擇操作可言的。因此,對於多型,僅僅對於物件的指標和引用的間接訪問,才會發生多型現象。

2. 虛函式機理

在上述**中,b.fun()函式呼叫顯示出多樣性,其編譯不能立即確定fun的確切位置,即不能確定到底是呼叫基類base的fun函式,還是子類sub的fun函式。

當編譯器看到fun的虛函式標誌時,以放入虛函式表中,等到遇到b.fun()這個虛函式的呼叫時,便將該**操作滯後到執行中,以實際的物件型別來實際**其對應的成員函式操作。當然編譯器不可能跟蹤到執行的程式中去,而是在**操作b.fun()處避開函式呼叫,只做乙個指向實際物件的成員函式的間接訪問。如此,實際物件若是基類,則呼叫的就是基類成員函式,若是子類,則呼叫的就是子類的成員函式。當然,每乙個實際的物件都必須額外占有乙個指標空間,以指向類中的虛函式表。如下圖所示。

從圖中可以看處,用了虛函式的類,其物件的空間比不用虛函式的類多了乙個指標的空間,由於涉及了其他的操作,包括間接訪問虛函式,物件的指標偏移量計算等,所以在應用了虛函式後,會影響程式的執行效率。

3.虛函式的傳播

虛函式在繼承層次結構中總是會自動地從基類傳播下去。因此,上述**中sub類中的成員函式fun的virtual說明可以省略,

例如下面的例子:

在乙個平面形狀類的體系中,基類shape有兩個子類:圓circle類和長方形retangle類,專門負責求面積的area函式在基類中設定為virtual就能使子類的響應同名函式虛擬化。

#include#include using namespace std;

class shape

virtual double area()const };

class circle : public shape

double area()const };

class rectangle : public shape

double area()const;

};double rectangle::area()const

void fun(const shape& sp)

int main()

C 學習之多型

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

c 學習之多型

多型分為兩類 1 靜態多型 函式過載和運算子過載屬於靜態多型,復用函式名 2 動態多型 派生類和虛函式實現執行時多型 靜態多型和動態多型的區別 1 靜態多型的函式位址早繫結 編譯階段確定函式位址 2 動態多型的函式位址晚繫結 執行階段確定函式位址 動態多型滿足條件 1 有繼承關係 2 子類重寫父類的...

C 學習筆記之 多型

目錄應用 計算器類 純虛函式和抽象類 虛析構和純虛析構 型別轉換 多型性提供介面與具體實現之間的另一層隔離,將 什麼 和 怎麼做 分開 分類 動態多型 函式位址晚繫結 include using namespace std 動物類 class animal class dog public anim...