why虛析構函式?
主要還是由於基類指標或引用可以不進行顯示型別轉換的情況下指向派生類物件。同時通過引用或者指標或引用呼叫方法時遵循:
例如:定義了基類brass,派生類brassplus
如果viewacct()不是虛方法,則b1_ref.viewacct()和b2_ref.viewacct()均是使用brass的方法。
如果viewacct()是虛方法,那麼b1_ref.viewacct()使用brass的方法,但b2_ref.viewacct()是使用brassplus的方法。
如此,如果刪除該引用或指標,在呼叫析構函式時遵循上述原則:
例如:基類brass 的析構函式為虛函式,同時通過fullname 區分不同的物件。派生類brassplus每次呼叫析構函式時列印「brassplus」。通過兩個析構函式的列印可以明確的看到那個物件在掉用了哪乙個析構函式。
測試**如下:
檢視執行結果:
通過執行結果可以看出:在刪除p_client[0] 時呼叫了基類brass的析構函式,在刪除p_client[1] 時,雖然其指標型別為brass, 但是仍然首先呼叫了派生類brassplus 的析構函式,然後呼叫了對應的基類的析構函式。滿足虛方法,程式根據指標指向的物件型別選擇方法。
修改brass 的析構函式為非虛函式,其他部分不變
檢視執行結果:
通過執行結果可以看出:刪除p_client[0]仍舊掉用了brass 的析構函式,但是在刪除p_client[1]時,並未呼叫brassplus 的析構函式,而直接呼叫了基類的析構函式。則派生類brassplus 物件並未被刪除。
綜上所述:基類必須有乙個虛析構函式,即使該析構函式不執行任何操作。
基類虛析構函式分析
多型是由虛函式表來實現,通過父類指標來實現動態繫結。子類重寫父類的虛函式後,覆蓋虛函式表中父類該虛函式在表中原來的位置,也許 覆蓋 也就是由此得稱。那析構函式是否也如此呢?程式 中經常可以見到將基類的析構函式寫成虛函式,目的就是為了防止由以下這種情況造成的記憶體洩漏 class a class b ...
多型基類與虛析構函式
假設我們有乙個基類a,很不幸的,a的析構函式是乙個non virtual。同時我們有乙個派生類b,它派生自a。我們定義了乙個a型別指標,它指向的實際物件是b a ptr new b 然後在程式的某處,我們不再需要b了,我們將指標ptr delete掉 delete ptr 注意new永遠要和dele...
確定基類有虛析構函式
有時,乙個類想跟蹤它有多少個物件存在。乙個簡單的方法是建立乙個靜態類成員來統計物件的個數。這個成員被初始化 為0,在建構函式裡加1,析構函式裡減1。條款m26裡說明了如何把這種方法封裝起來以便很容易地新增到任何類中,my article on counting objects 提供了對這個技術的另外...