如果我是對的,默認解構式總是隱式宣告的,除非用戶宣告它。根據cppreference:
通過指向基類的指標洗掉物件會呼叫未定義的行為,除非基類中的解構式是虛擬的
現在,考慮這個例子:
struct B {};
struct D : B {};
隱式宣告的解構式是B::~B()虛擬的嗎?如果不是,我應該在使用繼承時總是宣告一個虛擬解構式嗎?
uj5u.com熱心網友回復:
隱式宣告的解構式 B::~B() 是虛擬的嗎?
不,根據class.dtor/3:
類 X 的隱式宣告的預期解構式將具有以下形式
~X()
并且,自然地,根據class.dtor/12:
如果一個類有一個帶有虛擬解構式的基類,它的解構式(無論是用戶宣告的還是隱式宣告的)是虛擬的
如果不是,我應該在使用繼承時總是宣告一個虛擬解構式嗎?
C 核心指南,C.35建議將公共的基類解構式設為虛擬:
C.35:基類解構式應該是公共和虛擬的,或者是受保護的和非虛擬的
原因防止未定義的行為。如果解構式是公共的,則呼叫代碼可以嘗試通過基類指標銷毀派生類物件,如果基類的解構式是非虛擬的,則結果是未定義的。如果解構式是受保護的,則呼叫代碼不能通過基類指標進行銷毀,解構式不需要是虛擬的;它確實需要受到保護,而不是私有的,以便派生的解構式可以呼叫它。通常,基類的撰寫者不知道銷毀時要執行的適當操作。
[...]
注意虛函式定義了派生類的介面,無需查看派生類即可使用該介面。如果介面允許銷毀,那么這樣做應該是安全的。
[...]
例外我們可以想象一種情況,您可能需要一個受保護的虛擬解構式:當派生型別的物件(并且只有這樣的型別)應該被允許通過指向基類的指標銷毀另一個物件(不是它自己)時。不過,我們在實踐中還沒有看到這樣的案例。
執法
- 具有任何虛函式的類應該具有公共和虛擬或受保護和非虛擬的解構式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/314636.html
