虛函式的作用

2021-06-01 23:36:25 字數 1712 閱讀 7810

虛函式的作用是實現動態聯編,也就是在程式的執行階段動態地選擇合適的成員函式,在定義了虛函式後,可以在基類的派生類中對虛函式重新定義,在派生類中重新定義的函式應與虛函式具有相同的形參個數和形參型別。以實現統一的介面,不同定義過程。如果在派生類中沒有對虛函式重新定義,則它繼承其基類的虛函式。

當程式發現虛函式名前的關鍵字virtual後,會自動將其作為動態聯編處理,即在程式執行時動態地選擇合適的成員函式。

([2010.10.28] 注:下行語義容易使人產生理解上的偏差,實際效果應為:

如存在:base -> derive1 -> derive2 及它們所擁有的虛函式func()

則在訪問派生類derive1的例項時,使用其基類base及本身型別derive1,或被靜態轉換的後續派生類derive2的指標或引用,均可訪問到derive1所實現的func()。)

動態聯編規定,只能通過指向基類的指標或基類物件的引用來呼叫虛函式,其格式:

指向基類的指標變數名->虛函式名(實參表)

或 基類物件的引用名. 虛函式名(實參表)

虛函式是c++多型的一種表現

例如:子類繼承了父類的乙個函式(方法),而我們把父類的指標指向子類,則必須把父類的該函式(方法)設為virtual(虛函式)。

使用虛函式,我們可以靈活的進行動態繫結,當然是以一定的開銷為代價。 如果父類的函式(方法)根本沒有必要或者無法實現,完全要依賴子類去實現的話,可以把此函式(方法)設為virtual 函式名=0 我們把這樣的函式(方法)稱為純虛函式。

如果乙個類包含了純虛函式,稱此類為抽象類 。

下面是對c++的虛函式的理解。

(如果不知道虛函式為何物,但又急切的想知道,那你就應該從這裡開始)

簡單地說,那些被virtual關鍵字修飾的成員函式,就是虛函式。虛函式的作用,用專業術語來解釋就是實現

多型性(polymorphism),多型性是將介面與實現進行分離;用形象的語言來解釋就是實現以共同的方法,但因個體差異而採用不同的策略。下面來看一段簡單的**

class a;

class b:public a;

int main()

通過class a和class b的print()這個介面,可以看出這兩個class因個體的差異而採用了不同的策略,輸出的結果也是我們預料中的,分別是this is a和this is b。但這是否真正做到了多型性呢?no,多型還有個關鍵之處就是一切用指向基類的指標或引用來操作物件。那現在就把main()處的**改一改。

int main()

執行一下看看結果,喲呵,驀然回首,結果卻是兩個this is a。問題來了,p2明明指向的是class b的物件但卻是呼叫的class a的print()函式,這不是我們所期望的結果,那麼解決這個問題就需要用到虛函式

class a;

class b:public a;

毫無疑問,class a的成員函式print()已經成了虛函式,那麼class b的print()成了虛函式了嗎?回答是yes,我們只需在把基類的成員函式設為virtual,其派生類的相應的函式也會自動變為虛函式。所以,class b的print()也成了虛函式。那麼對於在派生類的相應函式前是否需要用virtual關鍵字修飾,那就是你自己的問題了。

現在重新執行main2的**,這樣輸出的結果就是this is a和this is b了。

現在來消化一下,我作個簡單的總結,指向基類的指標在操作它的多型類物件時,會根據不同的類物件,呼叫其相應的函式,這個函式就是虛函式。

虛函式的作用

虛函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。例 基類與派生類中有同名函式。在下面的程式中student是基類,graduate是派生類,它們都有display這個同名的函式。include include using namespa...

虛函式的作用

虛函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。例 基類與派生類中有同名函式。在下面的程式中student是基類,graduate是派生類,它們都有display這個同名的函式。include include using namespa...

虛函式的作用

虛函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。例 基類與派生類中有同名函式。在下面的程式中student是基類,graduate是派生類,它們都有display這個同名的函式。include include using namespa...