關於虛函式的理解

2021-06-14 02:43:10 字數 1776 閱讀 9979

最近突然發現,我對虛函式的理解有些迷茫,在網上查了查,做個個簡要的理解。  

一般,在c++中,虛函式是用來實現基類和派生類的成員函式的。看著貌似和過載函式相類似,但是兩者確實還是有些區別。 

首 先,虛函式是用virtual 來修飾這個函式的。一般這樣的情況就是為我們宣告了這個成員函式屬於虛函式,於是我們就可以在其派生類中重新定義這個函式的實現方式,當程式在執行時動態的選擇合適的成員函式(我個人認為,就是程式具體涉及到哪個類的時候,就呼叫該類中所定義的虛函式的實現方式。)。

其次,我覺得派生類中的虛函式無論是函式名,還是函式引數及引數型別都應該是一樣的。這就是和過載函式最大的區別。

還有一種特點就是:如果子類繼承了父類的乙個函式(方法),而我們把父類的指標指向子類,則必須把父類的該函式(方法)設為virtual(虛函式)。

例如:#include

using namespacestd;

classcshape

virtual voiddisplay(void)

private:

int m_ncolor;

};classcrectangle:publiccshape

};classc********:publiccshape

};classcellipse :publiccshape

};void main()

;for(inti= 0;i< 4; i++)

pshape[i]->display( );

}本程式執行結果:

cshape

cellipse

c********

crectangle

如果把cshape類裡面virtual voiddisplay(void) 中的virtual去掉的話

執行結果就不一樣了:

cshape

cshape

cshape

cshape

在 這裡面的cshape * pshape[4]= ;這條語句就是把父類的指標指向了子類(我個人認為,如果不對,請指正),,然後再通過這個基類指標呼叫虛函式。於是在我們後來的呼叫display實 現時候,要把其定義為虛函式。

再乙個,就是在呼叫虛函式的時候,也要注意一些其他的問題。1,虛函式的實現,一般主要涉及在基類和派生類之間。如果是兩種無關的類的時候,就不存在什麼虛函式的關聯了。2,虛函式的一般先實現在用基類指標指向派生類物件的時候,然後間接或直接的使用基類指標呼叫虛函式(結合上個例子)。3,只有類的成員函式才可以為虛函式,而且建構函式是不能為虛函式的。但是,乙個優秀的程式設計師總是喜歡把基類的析構函式作為虛函式來實現。一般說來這樣的好處是,如果我們需要用delete刪除乙個派生類物件時,根據虛函式的特點,系統會呼叫與派生類相關的析構函式,而若若是不作為虛函式,那麼直接就呼叫了基類的虛函式。4,虛函式只需要在宣告的時候加上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關鍵字修飾的成員函式,就是虛函式。虛函式的作用,用專業術語來解釋...