虛擬和受保護的解構函式

設計為繼承的類稱為 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.
};