先放結論:在的!
而且與宣告的先後順序有關
為什麼有這個疑問呢?因為析構函式的名字不一樣啊......(好吧,是我too young了)
實驗**的繼承關係如下:
class fa
virtual ~fa()
virtual show()
virtual wohs()
};class son : public fa
virtual ~son()
virtual show()
virtual wohs()
};
先對乙個對函式指標改改名,方便定義:
typedef void(* func)(void);
雖然c++標準明確規定不能獲取建構函式和析構函式的位址,但是這一切在指標的面前都是浮雲(論指標的可怕之處......)
int main()
然後成功地發現析構函式呼叫了兩次,一次是fff調的,一次是return時調的,至於fff是什麼型別的函式指標?隨意,反正到最後
怎麼還是析構......(經過試驗,虛析構函式佔兩個位,不知道為什麼......)
那再試下下乙個,下兩個......
好,子類的虛函式show出來了
子類的虛函式wohs也出來了
可見虛析構函式真的在虛函式表,而且和宣告順序有關(這個可以自己試驗下)
然後還有個問題,既然子類的虛函式表中只有子類虛析構函式,那它怎樣析構父類呢?父類的析構函式又在哪呢?
老規矩,反彙編走起
下一部,進入到子類的析構函式:
然後驚喜地發現,在子類的析構函式中包含著對父類析構函式的呼叫
雖然父子的析構函式名字不一樣,但是他們佔同乙個坑(即父子析構函式在虛函式表中的位置是一樣的,否則就不存在多型了)
析構時,到特定的坑中呼叫該型別的析構函式,其析構函式中又巢狀了很多對父類的析構函式的呼叫
C 多型 虛函式 虛析構函式以及虛函式表
什麼是多型 指不同物件收到相同訊息時或相同物件收到不同訊息時產生不同的動作。這裡先說下為什麼會用到虛函式 以下面的程式為例 這個程式中,carp是fish的繼承類,而carp中覆蓋了swim這個方法,在makefishswim這個函式中,要使用fish類的形參,而你將yourfish這個carp類的...
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...