是否需要將C++析構函數定義爲虛擬?如果是這樣,爲什我已經讀過,他們需要確保在將基類指針轉換爲派生類時進行適當的清理。是否需要定義一個虛擬析構函數?
2
A
回答
4
需要虛擬析構函數來允許將析構函數調用動態分派到層次結構樹中的相應類。
在其中,你有一個情況:
Base *d = new Derived();
delete d;
沒有virtual
析構函數,你有不確定的操作。這是因爲編譯器無法找到Derived
最專業的析構函數,因爲它沒有被聲明爲virtual
。
2
它不是正式需要的 - 你可以很容易地編譯一個具有虛函數的類,但不是一個虛擬析構函數,但這是不明智的。
想象一下,您有一個基類A和兩個派生類B和C.B和C具有不同的字段,並且需要在析構函數中進行不同的清理。
現在您分配
A *p = new B();
然後,當你調用
delete p;
,編譯器將不知道調用哪個析構函數(其實這是根據C++標準未定義的行爲)。
如果你不定義虛析構函數中,只有A的析構函數可以調用,這是不是在我們的假設B類
充足的情況下如果你從來沒有用new
關鍵字實例化類(之後它delete
它),你不需要一個虛擬析構函數。但是,添加虛擬析構函數不會影響性能,所以最好始終提供它。
相關問題
- 1. 如果基類析構函數是虛擬的,是否需要派生類析構函數定義?
- 2. 虛擬析構函數 - 有需要時
- 3. 沒有虛擬構造函數但是虛擬析構函數
- 4. 非RAII類是否需要用戶定義的析構函數?
- 5. 如果後代類沒有非靜態成員或析構函數,我是否需要虛擬析構函數?
- 6. C++虛擬析構函數
- 7. CRT虛擬析構函數
- 8. 虛擬析構函數?
- 9. C++虛擬析構函數
- 10. 虛擬函數是否應該有一個定義?
- 11. 使用隱形模式時需要虛擬析構函數嗎?
- 12. 以下哪種情況下需要虛擬析構函數?
- 13. 在虛擬析構函數中調用其他虛擬方法是否安全?
- 14. 使用虛擬析構函數,我需要爲每個子類明確聲明一個虛擬析構函數嗎?
- 15. 虛擬析構函數是否被繼承?
- 16. 虛擬析構函數和未定義的行爲
- 17. 虛擬析構函數可以是一件壞事嗎?
- 18. 虛擬析構函數如何工作?
- 19. 虛擬析構函數分段錯誤
- 20. 虛擬析構函數:不工作?
- 21. C++需要析構函數
- 22. Facebook圖表是否永遠需要同一個虛擬主機?
- 23. 是否構造函數總是需要一個內存分配
- 24. 代表應該有一個虛擬析構函數嗎?
- 25. `std :: packaged_task`是否需要一個CopyConstructible構造函數參數?
- 26. 如果您始終將其存儲在shared_ptr中,那麼您的界面是否需要虛擬析構函數?
- 27. OOP - 是否需要構造函數?
- 28. 我是否必須在類體外定義純虛析構函數?
- 29. 使用@Autowired時,我需要定義一個構造函數嗎?
- 30. 我是否需要在析構函數中使用DeleteCriticalSection?
不需要,但強烈推薦。 –
你能詳細說明一下嗎?一個例證會很棒。 – bblincoe