虛函式是多型的得力助手之一。可以在子類繼承到父類的成員函式時,在不改函式名的情況下,將他的功能重新定義,為己所用。
要注意的是,被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 程式的執行結果...
類的多型(虛函式)
個人筆記,看不懂莫怪 一多型 在程式執行的過程中才能決定呼叫什麼方法,宣告基類的指標,利用該指標指向任意乙個子類的物件,呼叫相應的虛函式,可以根據指向的子類的不同而實現不同的方法。同一操作作用於不同的物件,可以有不同的解釋,產生不同的執行結果。類中的多型就是派生類對同基類的方法進行了重寫,然後程式根...