Cpp 虛函式的存在

2021-07-07 02:10:08 字數 2746 閱讀 1253

定義:在某

基類中宣告為 virtual 並在乙個或多個

派生類中被重新定 義的

成員函式。

用法格式:virtual 函式返回型別 函式名(參數列)

作用:它是實現多型性

,通過指向派生類的基類

指標或引用,訪問派生類中同名覆蓋成員函式的基礎。

#include #include using namespace std;

//宣告基類student

class student

;//student類成員函式的實現

student::student(int n, string nam,float s)//定義建構函式

void student::display( )//定義輸出函式

現在用同乙個指標變數(指向基類物件的指標變數),不但輸出了學生stud1的全部資料,而且還輸出了研究生grad1的全部資料,說明已呼叫了grad1的display函式。用同一種呼叫形式「pt->display()」,而且pt是同乙個基類指標,可以呼叫同一類族中不同類的虛函式。這就是多型性,對同一訊息,不同物件有 不同的響應方式。

2.1 

非類的成員函式

不能定義為虛函式,類的成員函式中

靜態成員

函式和建構函式

也不能定義為虛函式,但可以將

析構函式

定義為虛函式。實際上,優秀的程式設計師常常把

基類的析構函式定義為虛函式。因為,將基類的析構函式定義為虛函式後,當利用delete刪除乙個指向

派生類定義的

物件指標

時,系統會呼叫相應的類的析構函式。而不將析構函式定義為虛函式時,只呼叫基類的析構函式。

2.2 只需要在宣告函式的類體中使用關鍵字

「virtual」將函式宣告為虛函式,定義函式時不需要使用關鍵字「virtual」。

2.3 當將基類中的某一成員函式

宣告為虛函式後,派生類中的同名函式(函式名相同、引數列表完全一致、返回值型別相關)自動成為虛函式。

2.4 如果宣告了某個成員函式為虛函式,則在該類中不能出現和這個成員函式同名並且返回值、引數個數、型別都相同的非虛函式。在以該類為基類

的派生類

中,也不能出現這種同名函式。

3.1 派生類一般會重新定義所繼承的虛函式,如果派生類沒有定義某個虛函式,則使用基類中定義的版本。派生類必須對想要重定義的每個繼承成員進行宣告。

3.2 派生類中虛函式的宣告必須與基類中的定義方式完全匹配,例外:返回對基型別的引用(或指標)的虛函式。派生類中的虛函式可以返回基類函式所返回型別的派生類的引用或指標(不太懂,待深究)。

4.1 c++中,通過

基類的引用或指標呼叫

虛函式時,發生動態繫結。引用(或指標)既可以指向基類物件也可以指向

派生類物件,這一事實是動態繫結的關鍵。用引用(或指標)呼叫的虛函式在執行時確定,被呼叫的函式是引用(或指標)所指物件的實際型別所定義的。

通過動態繫結,我們能夠編寫程式使用繼承層次中任意型別的物件,無須關注物件的具體型別,使用這些類的程式無須區分函式是在基類還是在派生類中定義的。

4.2 觸發動態繫結必須滿足兩個條件:只有指定為虛函式的成員函式才能進行動態繫結,成員函式預設為非虛函式,非虛函式不進行動態繫結;必須通過基類型別的引用或指標進行函式呼叫。(必須理解在使用繼承層次中某一型別的物件的引用或指標會發生什麼)

為了派生類虛函式呼叫基類中的版本,我們有時需要使用覆蓋虛函式機制並強制函式呼叫使用虛函式的特定版本,這時可以使用作用域操作符:

item_base *basep = &derived;

double d = basep->item_base::net_price(42);

這段**強制將net_price呼叫確定為item_base中定義的版本,該呼叫將在編譯時確定。

6.1 純

虛函式是一種特殊的虛函式,在許多情況下,在

基類中不能對虛函式給出有意義的實現,而把它宣告為純虛函式,它的實現留給該基類的

派生類去做。這就是純虛函式的作用。

6.2 純虛函式可以讓類先具有乙個操作名稱,而沒有操作內容,讓派生類在繼承時再去具體地給出定義。凡是含有純虛函式的類叫做

抽象類。這種類不能宣告物件,只是作為基類為派生類服務。除非在派生類中完全實現基類中所有的的純虛函式,否則,派生類也變成了抽象類,不能例項化物件。

6.3 在基類中實現純虛函式的方法是在函式原型後加

「=0」

6.4 純虛函式只有函式的名字而不具備函式的功能,不能被呼叫。它只是通知編譯系統:「在這裡宣告乙個虛函式,留待派生類中定義」。在派生類中對此函式提供定義後,它才能具備函式的功能,可被呼叫。純虛函式的作用是在基類中為其派生類保留乙個函式的名字,以便派生類根據需要對它進行定義。如果在基類中沒有保留函式名字,則無法實現多型性。如果在乙個類中宣告了純虛函式,而在其派生類中沒有對該函式定義,則該虛函式在派生類中仍然為純虛函式。(具體例程待補充)

接下來再補充乙個虛函式的例子

有問題歡迎討論,後序待補充

Cpp虛函式提高 虛函式指標,虛函式表,物件模型)

1.虛函式實現過程 普通的成員函式以及呼叫 include using namespace std class a 執行結果b,b,b 2.虛函式特點 普通成員函式呼叫跟著類方法走,虛函式跟著物件方法走。為什麼?我們下面輸出類b的大小來看sizeof b 8 原因是宣告虛函式的物件中,存放著虛函式指...

cpp虛函式全解與實測

前言 說來許久沒更新部落格,但小張並沒有荒廢,意志也沒有消退。此刻正被老闆派到河北某村兒出差,手裡還沒有心儀的offer,實慘。言歸正傳,直接給出用於測試cpp虛函式的純虛函式,虛函式,動態多型,建構函式與析構函式的 各位看官應該一看便知其中的奧妙 虛函式動態多型 created by wbzhan...

C 虛函式表 存在哪

c 通過虛函式實現多型。那麼虛函式表具體儲存在哪?是每乙個物件都有虛函式表,還是每一類有虛函式表?讓我們通過 分析一下。執行在windows平台,使用visual studio2010編譯。c 中,乙個類存在虛函式,那麼編譯器就會為這個類生成乙個虛函式表,在虛函式表裡存放的是這個類所有虛函式的位址。...