當我們delete乙個動態分配的物件的指標時將執行析構函式。如果指標指向繼承體系中的某個型別,則有可能出現指標的靜態型別與被刪除的動態型別不相符合的情況。例如,如果我們要delete乙個parent*(父類指標)型別的物件,則該指標可能指向了乙個son(子類)型別的物件。如果這樣的話,編譯器就必須清楚地知道它應該執行的是parent的析構函式,還是son的析構函式。
1//假設parent沒有虛析構函式,son是它的子類
2 parent* getsomething();//
此函式返回乙個指標,指標指向son派生類的動態分配物件34
5 parent* ptk=getsomething();
6delete ptk;//
此行為未定義,編譯器不知道呼叫誰的析構函式
我們通過在基類中將析構函式定義為虛函式以確保執行正確的析構函式版本:
1class
parent
24 }
和其它虛函式一樣,析構函式的虛屬性也會被繼承。因此,無論parent的派生類使用的析構函式是自己的還是編譯器生成的析構函式,都將是虛析構函式。只要基類的析構函式是虛函式,就能確保我們delete基類指標時將執行正確的析構函式版本:
1 parent* item=newparent;//靜態型別與動態型別一致
2delete item;//
呼叫parent的析構函式
34 parent* item1=new
son;//靜態型別與動態型別不一致
5delete item1;//
呼叫son的析構函式
如果基類的析構函式不是虛函式,則delete乙個指向派生類物件的基類指標將產生未定義的結果。
什麼時候需要將類的析構函式宣告為虛析構函式:
乙個類內含有虛函式會使物件的體積增加,而且**移植性變差。當乙個類不作為基類的時候,通常沒必要將其虛構函式宣告未virtual;如果類帶有任何virtual函式,那麼該類就應該擁有乙個virtual析構函式,因為該類的設計目的一般是多型用途;如果不是為了多型用途而設計的基類,則也不需要virtual析構函式。
引用c++ primer 第五版
effective c++
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...