以上程式的執行結果:
c++中當派生類的物件撤銷時,一般先執行基類的建構函式,然後執行派生類的析構函式。以上程式的執行結果是符合預期的,再看以下**:
以上**執行結果:
執行結果可以看到,本程式只執行了基類的析構函式,而沒有執行派生類的析構函式。主函式中,用new運算子建立了乙個派生類的無名物件,並將乙個基類的指標變數指向了這個物件,當delete函式被呼叫後系統只執行了基類的析構函式,而沒有執行派生類的析構函式。
原因是這樣的,c++中允許基類的物件指標指向它的公有派生類的成員,但是基類的物件指標指向派生類的物件時,只能訪問派生類從基類繼承來的成員。在一般情況下,通過類的物件的指標呼叫某個函式,函式的函式體(即函式執行的操作)在編譯時就會確認,這就是所謂的靜態聯編。本程式編譯時,系統通過指標變數的型別為base類,判斷撤銷指標變數所指向的變數時將呼叫類base的析構函式。編譯器不會去理會指標指向的變數是屬於類base還是其派生類。
如果希望c++編譯器能夠靈活一點、機智一點、聰明一點,根據指標指向的物件的類別,呼叫相應類別的析構函式(即所謂的動態聯編),那我我們可以將基類的析構函式聲名為虛析構函式。
執行結果:
修改後程式的執行結果是符合我們的預期的。由於我們使用了虛析構函式,程式進行了動態聯編,實現了執行時的多型性。
雖然派生類的析構函式與基類的析構函式名字不同,但是將基類的析構函式聲名虛函式,那麼該基類的所有派生類的析構函式也都自動的成為虛函式。
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...