C 多型性與虛函式

2021-10-02 13:58:13 字數 2714 閱讀 5611

物件導向的三個特徵:封裝、繼承和多型。

多型的意思是乙個事物有多種形態,英文單詞為polymorphism,向不同的物件傳送同乙個訊息,不同的物件在接收時會產生不同的行為(方法)。也就是說,每個物件可以用自己的方式去相應共同的訊息。

例如函式的過載、運算子的過載都是多型現象。

乙個生活中的例子,比如學生開學,校長發布一條哪一天開學的資訊,不同的物件會產生不同的反應,學生就要準備上學,家長要準備學費,老師也要開始備課,學校食堂開始採購食材,這就是多型性,如果沒有多型性的話,校長就需要分別對學生、教師和家長等不同的物件單獨發通知。

在c++中,多型性表現形式之一是:具有不同功能的函式可以用同乙個函式名,這樣就可以實現用乙個函式名呼叫不同內容的函式。

從系統實現的角度來看,多型性分為兩類:靜多型性和動多型性

靜多型性是通過函式過載實現的,動多型性是通過虛函式實現的。

c++中的虛函式就是用來解決動態多型問題的,所謂虛函式,就是在基類宣告函式是虛擬的,並不是實際存在的,然後在派生類中才正式定義此函式,在程式執行期間,用指標指向某一派生類物件,這樣就能呼叫指標指向的派生類物件中的函式,而不對呼叫其他派生類中的函式。

例如乙個基類學生類有乙個display方法,這個方法可以輸出學生的基本資訊,另外有乙個派生類畢業生類,也有display方法,可以輸出畢業生的基本資訊

class

student

student::

student

(int n,string nam)

void student::

display()

class

graduate

:public student

graduate::

graduate

(int n,string nam,

int tim)

void graduate::

display()

intmain()

這段**的結果為;

num:1

name:a

num:1

name:b

可以看出派生類graduate中的display()方法並沒有實現,實現的是student中的display方法,我們只需在student類中的display方法前面加乙個virtual,就可以把基類中的函式宣告為虛函式,第二次輸出的結果就呼叫了派生類的display方法。

在基類中用virtual宣告成員函式為虛函式,在類外定義虛函式是,不必再加virtual

在派生類中重新定義此函式,函式名、函式型別、函式引數個數和型別必須與基類的虛函式相同。

定義乙個指向基類物件的指標變數,並使它指向同一類族中需要呼叫該函式的物件

通過該指標變數呼叫此虛函式,此時呼叫的就是指標變數指向的物件的同名函式

使用虛函式需要注意以下兩點

只能用virture宣告類的成員函式,把它作為虛函式,而不能將類外的普通函式宣告為虛函式,因為虛函式的作用是在派生類中對基類的虛函式重新定義,它只能用於類的繼承層次結構中。

乙個成員函式被宣告為虛函式後,在同一類族中的類就不能再定義乙個非虛函式但與該虛函式具有相同的引數和函式返回值型別的同名函式。

根據什麼把乙個成員函式宣告為虛函式?

首先看成員函式所在的類是否會作為基類,然後看成員函式在類的繼承後有無可能被更改功能,如果希望更改其功能,一般將其宣告為虛函式

如果成員函式在類被繼承後功能無須修改,或派生類用不到該函式,則不必把它宣告為虛函式

應考慮對成員函式的呼叫時通過物件名還是通過基類指標或引用去訪問的,如果通過基類指標或引用去訪問,則應當宣告為虛函式

在定義虛函式時,並不定義其函式體,即函式是空的,他的作用只是定義了乙個虛函式名,具體功能由派生類實現

如果用new運算建立了乙個臨時物件,若基類中有虛構函式,並且定義了乙個指向該基類的指標變數,在程式用delete運算子撤銷物件時,會發生乙個情況系統只會執行基類的析構函式,而不會執行派生類的析構函式。

#include

using

namespace std;

class

point

~point()

}class

circle

:public point

~circle()

}int

main()

如果沒有使用虛析構函式的話,即使是派生類物件進行delete操作,其執行結果為executing pont destructor,並沒有執行派生類的析構函式,所以我們要利用虛析構函式來完成對派生類的操作

#include

using

namespace std;

class

point

virture ~

point()

}class

circle

:public point

~circle()

}int

main()

此時執行的結果為

executing pont destructor

executing circle destructor

virture 函式型別 函式名 (引數列表)=0

(沒什麼用)

不用來定義物件,只是作為一種基本型別用作繼承的類,也稱作抽象基類,凡是包含純虛函式的類都是抽象類

C 多型性與虛函式

物件導向程式設計中的多型性是指向不同的物件傳送同乙個訊息,不同物件對應同一訊息產生不同行為。在程式中訊息就是呼叫函式,不同的行為就是指不同的實現方法,即執行不同的函式體。也可以這樣說就是實現了 乙個介面,多種方法 從實現的角度來講,多型可以分為兩類 編譯時的多型性和執行時的多型性。前者是通過靜態聯編...

C 多型性 與 虛函式

1.運算子過載 運算子過載形式 1 過載為類的成員函式 運算子過載函式說明為類的成員函式的格式為 類名 operator 運算子 參數列 如 c1 c2 編譯器將給出的解釋為 c1.operator c2 該運算子過載函式僅僅有乙個引數,所以過載為成員函式時,雙目運算子僅有乙個引數。對於單目運算子,...

C 多型性與虛函式

多型性是物件導向程式設計的關鍵技術之一。利用多型性技術,可以呼叫同乙個函式名的函式,實現完全不同的功能。若程式語言不支援多型性,不能稱為物件導向的語言。在c 中有兩種多型性 1 定義格式 虛函式是乙個類的成員函式,定義格式如下 virtual 返回型別 函式名 參數列 說明 2 通過虛函式實現多型性...