多型的整體認識 虛函式篇

2021-07-24 04:48:13 字數 1729 閱讀 2951

虛函式是多型的得力助手之一。可以在子類繼承到父類的成員函式時,在不改函式名的情況下,將他的功能重新定義,為己所用。

要注意的是,被static修飾的靜態成員函式,被inline修飾的內聯函式,建構函式不可以被宣告為虛函式。當在基類的成員函式型別前加了virtual修飾後,繼承他的子類中重寫時也會自動加上。

class a

輸出結果:

contructor a!

contructor b!

bdestructor

a!

我們會發現系統只呼叫了a類的析構函式,而沒有呼叫b類的,當我們在堆中自己分配了一塊空間,我們就得在操作完成之後及時**,不然會導致記憶體的洩露。上述例子就出現了這一問題。

#include 

using

namespace

std;

class a

輸出結果:

contructor a!

contructor b!

bdestructor

b!destructor

a!

利用虛析構函式就能很好地解決這一問題。這是初學者很難注意到的問題,我要不是寫這篇部落格,可能也會經常疏忽。

純虛函式,看上去比虛函式純一點,也就是虛函式沒有了函式體。其實,它的作用和虛函式是有很大不同的。

class a

包含純虛函式的類稱為抽象類。由於抽象類包含了沒有定義的純虛函式,所以不能定義抽象類的物件。基類中的純虛函式在被子類中被定義。除非在子類中完全實現基類中所有的純虛函式,否則,派生類也變成了抽象類,不能例項化物件。

比如宣告基類為形狀,形狀並不是具體的物件,但是不管什麼形狀都有其面積。我們可以宣告乙個求面積的純虛函式。之後再宣告乙個子類為正方形,在正方形類中,如果不對求面積函式進行重寫,將其定義,編譯時將會報錯。

#include

using namespace std;

class line

virtual

float area()=0;//表面積

virtual

float volume()=0;//體積

virtual ~line(){};

};class rec:public line

float area()

~rec(){};

};class cuboid:public rec

float area()

float volume()

~cuboid(){};

};class cube:public cuboid

float area()

float volume()

~cube(){};

};int main()

純虛函式的作用是為派生類提供乙個一致的介面。所以他更像是基類給子類分配任務,也可以起到提示的作用。因為你如果沒有完成任務,編譯時就會報錯。

就好像抽象類(基類)是個工程師,純虛函式是建築圖紙。工程師繪製好圖紙,然後圖紙交給工人(也就是子類)。工程師只負責畫圖,他並不會壘磚建牆。而工人照著圖紙建築,合理分工,才能最終完成任務。

很多人對多型不甚了解,很多概念容易弄混,希望看了文章可以給你帶來幫助。還有虛析構函式的宣告是最容易被人所遺忘的,像我們這些初學者一定要特別注意。

對虛函式 虛表的認識

虛函式 實現多型的機制,多型就是用父型別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。讓父類的指標有 多種形態 一種泛型技術。關鍵字 virtual 虛函式表 此表中,主要是乙個類的虛函式的位址表,這張表解決了繼承 覆蓋的問題,保證其內容真實反映實際的情況。在c 標準規格說明書中...

對虛函式的認識

可以在繼承類中重寫父類的方法,關鍵字是virtual。如下 所示,父類是super,繼承類是sub,在sub中,重寫了super的go 方法。include using namespace std class super class sub public super int main 程式的執行結果...

類的多型(虛函式)

個人筆記,看不懂莫怪 一多型 在程式執行的過程中才能決定呼叫什麼方法,宣告基類的指標,利用該指標指向任意乙個子類的物件,呼叫相應的虛函式,可以根據指向的子類的不同而實現不同的方法。同一操作作用於不同的物件,可以有不同的解釋,產生不同的執行結果。類中的多型就是派生類對同基類的方法進行了重寫,然後程式根...