虛函式是用作實現子類的多型性的,它可以在執行的過程中選擇子類或者父類的同名函式,意思就是說,每次只有乙個函式執行。
但是對於析構函式來說,子類 與父類在銷毀物件時,都應該要呼叫 ,所以把父類的析構函式定義為虛函式,會發生什麼事情呢。
class
;class b:public a
;int main()
可以發現,a 和 b都呼叫了析構函式,這時如果把a類的virtual 去掉,那麼就不會呼叫b的析構函式了。
為什麼呢?因為父類只能呼叫子類中繼承父類的方法,而如果需要父類呼叫以屬於子類實現的方法,那麼只有把父類中同名的方法設定成虛函式,所以把父類的析構函式設定為虛函式,父類才能呼叫子類的析構函式。
所以把基類的析構函式寫為虛函式與其它成員函式寫作虛函式是不一樣的。
還有乙個問題就是為什麼不能把建構函式設定成虛函式?
1.因為虛函式是用來實現多型,如果把基類的建構函式設定成虛函式後,那麼在構造父類的時候 ,就不得不顯示呼叫父類的建構函式了,與多型相矛盾了
2.虛函式在繼承了父類並且物件都構造完後,在執行過程中實現動態繫結的,而在建構函式中,物件還沒有完全構造完,所以實現不了動態的繫結技術 ,實現不了多型。
當乙個類中包含乙個純虛函式時,這個類為抽象類,它是不能有例項物件的,如a是乙個抽象類,那麼不能使用 a a ;
總結:如果某個類不包含虛函式,那一般是表示它將不作為乙個基類來使用。當乙個類不準備作為基類使用時,就不要定義虛析構函式了,因為它會增加乙個虛函式表,使得物件的體積翻倍,還有可能降低其可移值性。
所以基本的一條是:無故的宣告虛析構函式和永遠不去宣告一樣是錯誤的。
當且僅當類裡包含至少乙個虛函式的時候,才去宣告虛析構函式。
抽象類是準備被用做基類的,基類必須要有乙個虛析構函式,純虛函式會產生抽象類,所以在想要成為抽象類的類裡宣告乙個純虛析構函式。
定義乙個函式為虛函式,不代表該函式未被實現,只是為了來實現多型。
定義乙個函式為純虛函式,才表示函式未被實現 ,定義它是為了實現乙個介面,起乙個規範作用。繼承抽象類的派生類要實現這個函式…
C 虛函式,純虛函式,虛析構和純虛析構
c 虛函式 定義為虛函式是為了允許用基類的指標來呼叫子類的這個函式,是需要具體實現的 virtual void funtion1 c 純虛函式 一 定義 純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加 0 vir...
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...