正如我所知在cpp,當我們刪除一個對象或當主要完成時,所有對象的析構函數將被調用。對於類型爲child的對象,首先調用子類的析構函數,然後調用父類的析構函數。
現在我很困惑。因爲如果允許使用純粹的虛擬析構函數,那麼當我們刪除一個類的子對象時它怎麼會被調用呢?它不是調用純虛擬父類的析構函數嗎?爲什麼有可能使析構函數純虛擬
2
A
回答
4
是的,基類的析構函數被調用。這意味着它必須必須有一個實現。可以爲任何純虛函數提供實現,包括析構函數。例如:
struct foo
{
virtual ~foo() = 0; // pure virtual dtor
};
foo::~foo() {} // implementation
純虛擬析構函數的用例是確保沒有任何其他純虛擬方法的類不能被實例化。
+0
這樣一個純虛函數只有在它是析構函數時才能實現它的實現? – Yves
+3
@Thomas不,其他純粹的虛擬成員函數*可能也有實現,但是析構函數*必須*。我會澄清這一點。 – juanchopanza
+0
非常感謝。我被一本愚蠢的書誤導了。 – Yves
相關問題
- 1. 如果從析構函數調用純虛函數是UB,爲什麼我們可以使用純虛擬desrtuctors?
- 2. 爲什麼std :: vector :: push_back具有虛擬析構函數的segfaults?
- 3. 爲什麼STL容器沒有虛擬析構函數?
- 4. 沒有虛擬構造函數但是虛擬析構函數
- 5. 爲什麼在繼承使用虛擬析構函數
- 6. 爲什麼純虛析構函數總是等同於零
- 7. 沒有虛擬方法的虛擬析構函數有什麼危害嗎?
- 8. C++虛擬析構函數
- 9. CRT虛擬析構函數
- 10. 虛擬析構函數?
- 11. C++虛擬析構函數
- 12. 爲什麼QWidget的析構函數不是虛擬的?
- 13. 爲什麼`boost :: multi_array_ref`的析構函數是非虛擬的?
- 14. 虛擬析構函數 - 有需要時
- 15. 爲什麼純虛擬機制不考慮繼承函數?
- 16. 在一行聲明並實現純虛擬析構函數?
- 17. 如何實現純虛擬析構函數?
- 18. 純虛擬函數調用
- 19. 界面中的純虛擬析構器
- 20. 類有虛函數和可訪問的非虛擬析構函數
- 21. 有沒有辦法調用純虛擬類的「刪除析構函數」?
- 22. 虛擬析構函數的用法是什麼?
- 23. 受保護的構造函數與純虛析構函數
- 24. C# - 爲什麼虛擬函數不能覆蓋抽象函數?
- 25. 稱爲即使基類的析構爲什麼派生類析構函數不是虛擬
- 26. 爲什麼我們有一個虛析構函數,而不是在C虛擬構造++?
- 27. 有沒有用於使受保護的析構函數虛擬?
- 28. 爲什麼structs沒有析構函數?
- 29. 虛擬析構函數如何工作?
- 30. 虛擬析構函數分段錯誤
在基類中的純虛析構函數迫使任何派生類實現析構函數,所以如果你有一個指向基類,並刪除它,然後再派生類析構函數被調用 – EdChum
@TartanLlama感謝 – Yves