虛擬和受保護的解構函式
設計為繼承的類稱為 Base 類。應該注意這類特殊成員的職能。
設計為在執行時以多型方式使用的類(通過指向基類的指標)應該宣告解構函式 virtual
。這允許正確地銷燬物件的派生部分,即使通過指向基類的指標銷燬物件也是如此。
class Base {
public:
virtual ~Base() = default;
private:
// data members etc.
};
class Derived : public Base { // models Is-A relationship
public:
// some methods
private:
// more data members
};
// virtual destructor in Base ensures that derived destructors
// are also called when the object is destroyed
std::unique_ptr<Base> base = std::make_unique<Derived>();
base = nullptr; // safe, doesn't leak Derived's members
如果類不需要是多型的,但仍需要允許繼承其介面,請使用非虛擬的 protected
解構函式。
class NonPolymorphicBase {
public:
// some methods
protected:
~NonPolymorphicBase() = default; // note: non-virtual
private:
// etc.
};
這樣的類永遠不會通過指標銷燬,從而避免由於切片導致的無聲洩漏。
這種技術特別適用於設計為 private
基類的類。這樣的類可以用於封裝一些常見的實現細節,同時提供 virtual
方法作為定製點。這種類永遠不應該以多型方式使用,而 protected
解構函式有助於直接在程式碼中記錄這一要求。
最後,某些類可能要求它們從不用作基類。在這種情況下,該類可以標記為 final
。在這種情況下,正常的非虛擬公共解構函式很好。
class FinalClass final { // marked final here
public:
~FinalClass() = default;
private:
// etc.
};