理解虛函式

2021-06-09 20:18:53 字數 1288 閱讀 3810

虛函式聯絡到多型,多型聯絡到繼承。所以本文中都是在繼承層次上做文章。沒了繼承,什麼都沒得談。

下面是對c++的虛函式這玩意兒的理解。

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

簡單地說,那些被virtual關鍵字修飾的成員函式,就是虛函式。虛函式的作用,用專業術語來解釋就是實現多型性(polymorphism),多型性是將介面與實現進行分離;用形象的語言來解釋就是實現以共同的方法,但因個體差異而採用不同的策略。下面來看一段簡單的**

class a

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

class a{

public:

virtual void print(){ cout<<」this is a」<

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

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

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

虛函式是在基類中定義的,目的是不確定它的派生類的具體行為。例:

定義乙個基類:class animal//動物。它的函式為breathe()//呼吸。

再定義乙個類class fish//魚 。它的函式也為breathe()

再定義乙個類class sheep //羊。它的函式也為breathe()

為了簡化**,將fish,sheep定義成基類animal的派生類。

然而fish與sheep的breathe不一樣,乙個是在水中通過水來呼吸,乙個是直接呼吸空氣。所以基類不能確定該如何定義breathe,所以在基類中只定義了乙個virtual breathe,它是乙個空的虛函式。具本的函式在子類中分別定義。程式一般執行時,找到類,如果它有基類,再找它的基類,最後執行的是基類中的函式,這時,它在基類中找到的是virtual標識的函式,它就會再回到子類中找同名函式。這就是虛函式的產生,和類的多型性的體現.

這裡的多型性是指類的多型性。

虛函式中「虛」的理解

1 首先回顧一下虛函式的概念 虛函式 不代表一定需要子類去實現,而是可以通過基類的指標呼叫子類的此函式。純虛函式 一定需要子類去實現它,它定義的僅僅是一組行為,擁有純虛函式的類即為抽象類,只能當做基類,無法例項化。2 為什麼叫 虛 函式呢 正是這個函式呼叫的不可 性,而這種不可 性即函式的呼叫在編譯...

虛函式的理解

includeusing namespace std class a virtual a virtual void print class b public a b void print int main 之前對虛函式一直一知半解,現在把總結的內容記錄下來。c 的物件導向的乙個特徵就是多型,即一切用...

C 虛函式和純虛函式理解

虛函式 函式中帶有關鍵字virtual 純虛函式 純虛函式是在基類中申明為虛函式,它在基類中沒有定義,但是要求任何派生類都需要定義自己的實現方法,在基類的實現純虛函式的方法是在函式原型後新增 0 virtual void funtion1 0 虛函式的過載函式然然為虛函式,在派生類中重定義虛函式時必...