首先我們知道虛函式是實現執行期的多型的。
根據型別相容原則,在需要基類指標的地方,都可以用派生類的指標去代替。
如下**,就實現了多型。
#include
using namespace std;
class a~a
()virtual void
fun()}
;class b:public a~b
()virtual void
fun()}
;int
main()
輸出:
其實,上面**是存在記憶體洩漏的。
我們把類a和類b的析構函式加上輸出看看
#include
using namespace std;
class a~a
()virtual void
fun()}
;class b:public a~b
()virtual void
fun()}
;int
main()
輸出:
可以發現testa沒有問題。
但是testb只有類a部分被析構了,而類b還沒有析構,這裡存在了記憶體洩漏
那麼將析構函式定義為虛函式後呢
#include
using namespace std;
class a
virtual ~a(
) virtual void
fun()}
;class b:public a
virtual ~b(
) virtual void
fun()}
;int
main()
輸出:
這樣就沒有問題了
所以,將析構函式設為虛函式,是為了防止記憶體洩漏。
如果存在用基類指標指向派生類物件,這樣子可以使得基類和派生類的析構函式都被呼叫,不會造成記憶體洩漏。如果不把析構函式定義為虛函式,那麼只會呼叫基類的析構函式。
為什麼要將類的析構函式宣告為虛函式?
我們知道在類的繼承中,建構函式的執行順序是先構造基類然後再構造派生類,析構函式則相反,是先析構派生類再析構基類。我們也知道宣告父類的指標指向派生類,編譯器會預設實施靜態繫結,不能呼叫派生類重寫的函式,所以才需要虛函式。虛函式是通過虛函式表實現,在執行時進行動態繫結,可以呼叫在派生類重寫的函式。那麼如...
C 析構函式為什麼要為虛函式
1.為什麼基類的析構函式是虛函式?在實現多型時,當用基類操作派生類,在析構時防止只析構基類而不析構派生類的狀況發生。下面 網路 源位址 a.第一段 includeusing namespace std class clxbase clxbase void dosomething class clxd...
C 析構函式為什麼要為虛函式
注 本文內容 於zhice163博文,感謝作者的整理。1.為什麼基類的析構函式是虛函式?在實現多型時,當用基類操作派生類,在析構時防止只析構基類而不析構派生類的狀況發生。下面 網路 源位址 a.第一段 includeusing namespace std class clxbase clxbase ...