09虛函式與多型性

2022-12-08 17:54:03 字數 2466 閱讀 6484

多型性與虛函式 1

1. 多型性概念 1

2. 虛函式 2

2.1. 虛函式的概念和使用方法: 2

2.2. 靜態關聯(早繫結)和動態關聯(晚繫結) 2

2.3. 虛函式表 3

2.4. 虛析構函式 3

2.5. 純虛函式和抽象類 4

2.6. 構造基類成員函式的一般性原則 5

顧名思義,多型的意思是乙個事物有多種形態。從程式設計的角度看,通常指對於同乙個訊息、同一種呼叫,在不同的場合,不同的情況下,執行不同的行為。例如運算子的過載和虛函式。

class cworm

};class cant:public cworm

};class cspider:public cworm

};void main()

usb *** mp4 ***

如上,同樣是pworm指標呼叫draw()成員函式,兩次呼叫執行了不同的動作,這就是虛函式實現了多型性的。

在基類用virtual宣告的成員函式即為虛函式。

在派生類中覆蓋此函式,要求函式名、函式返回型別、函式引數個數和型別全部與基類的虛函式相同,並根據派生類的需要重新定義函式體。當乙個成員函式宣告為虛函式後,其派生類中的同名函式都自動成為虛函式,無論是否加virtual關鍵字。

用基類的指標或者引用指向派生類的物件,通過用基類的指標或者引用呼叫虛函式,實際執行的將是派生類物件中定義的虛函式。

多型的三個條件:繼承覆蓋virtual 基類的指標或者引用指向派生類的物件

函式過載編譯階段overload

在多型性中,如果程式在編譯階段就能確定實際的執行動作,則稱為靜態關聯(static binding)或早繫結(early binding),如果只有等到程式執行階段才能確定實際的執行動作,則成為動態關聯(dynamic binding)或晚繫結(late binding)。

在虛函式的呼叫中,如果通過基類的指標或者引用呼叫,則為動態關聯,否則為靜態關聯。

例: cworm *pworm;

cant ant;

cspider spider;

pworm=&ant動態關聯

pworm->draw();

pworm=&spider動態關聯

pworm->draw();

cworm &wormalias=ant動態關聯

cworm worm;

worm=ant靜態關聯

通用化程式設計

如果類中包含有虛成員函式,在用該類例項化物件時,物件的第乙個成員將是乙個指向虛函式表的指標(pvftable)。虛函式表記錄執行過程中實際應該呼叫的虛函式的入口位址

pvftable虛函式表

如果有乙個基類的指標指向派生類的物件,並且想通過該指標delete派生類物件,系統將只會執行基類的析構函式,而不會執行派生類的析構函式。為避免這種情況的發生,往往把析構函式宣告為虛的,此時,系統將先執行派生類物件的析構函式,然後再執行基類的析構函式。

如果基類的析構函式宣告為虛的,派生類的析構函式也將自動成為虛析構函式,無論派生類析構函式宣告中是否加virtual關鍵字。

class cworm

virtual ~cworm()

};class cant:public cworm

~cant()

};void main()

純虛函式具有如下的一般形式:

virtual 返回型別函式名(引數列表)=0;

純虛函式沒有函式體{},即只有函式的宣告而沒有函式的定義。

通常在基類中宣告純虛函式,在派生類中定義該虛函式,如果派生類中也沒有定義該虛函式,則該函式在派生類中仍然為虛函式。

不能例項化物件的類稱為抽象類,具有純虛函式的類是不能例項化物件的,所以具有純虛函式的類是一種抽象類。

雖然抽象類不能例項化物件,但是可以用抽象類的指標指向派生類物件,並呼叫派生類的虛函式的實際實現。

class cworm

;class cant:public cworm

};bool createinstance(void **pinte***ce)

void main()

1、 基類在將來往往供許多的派生類繼承,為了避免過多冗餘和空間浪費,一般只會將預計絕大部分派生類都具有的成員函式提取到基類中。

2、 如果確定基類的成員函式能夠實現確定的、不變的功能,則不必把該函式宣告為虛的,這種成員函式的目的在於供派生類繼承基類已經實現的功能。即復用。

3、 如果預計不同的派生類都具有此成員函式的功能,但是在不同的派生類中有不同的具體實現,則應該把此種基類的成員函式宣告為虛的。這種成員函式的目的並不是供派生類繼承基類的功能,而是將此功能暴露給外部的呼叫者,外部的呼叫者只需要簡單地知道基類函式的呼叫方式和大體的功能,而不必關心該功能在不同的派生類中的實際實現。亦即向外部呼叫者提供介面的功能。

4、 如果有較成熟的類設計體系,或者打算用基類向外部呼叫者描述模組的功能,通過基類供外部呼叫的形式實現該模組的功能,則可以考慮將基類宣告為具有純虛函式的抽象類。

第十二章多型性與虛函式

1.在例12.1程式基礎上作一些修改。定義point 點 類,由point類派生出circle 圓 類,再由circle類 派生出cylinder 圓柱體 類。將類的定義部分分別作為3個頭檔案,對它們的成員函式的宣告部分分別作為 3個原始檔 cpp檔案 在主函式中用 include命令把它們包含進來...

09函式與方程 學生用

第九節函式與方程 1 函式的零點 1 定義 對於函式y f x x d 把使f x 0成立的實數x叫做函式y f x x d 的零點 2 函式的零點與相應方程的根 函式的圖象與x軸交點間的關係 方程f x 0有實數根函式y f x 的圖象與x軸有交點函式y f x 有零點 3 函式零點的判定 零點存...

09第九節函式的連續性與間斷點

客觀世界的許多現象和事物不僅是運動變化的,而且其運動變化的過程往往是連綿不斷的,比如日月行空 歲月流逝 植物生長 物種變化等,這些連綿不斷發展變化的事物在量的方面的反映就是函式的連續性.本節將要引入的連續函式就是刻畫變數連續變化的數學模型.16 17世紀微積分的醞釀和產生,直接肇始於對物體的連續運動...