共用方式為


警告 C26436

具有虛擬函式的類型 ' symbol ' 需要公用虛擬或受保護的非虛擬解構函式 (c.35)

C++ 核心指導方針 :C.35 :基類解構函式應該是公用和虛擬,或受保護和非虛擬

如果類別定義虛擬函式,它就會變成多型,這表示衍生類別可以變更其行為,包括資源管理和解構邏輯。 由於用戶端程式代碼可能透過基類指標呼叫多型類型,因此用戶端無法明確地選擇適當的行為,而不需要向下轉換。 若要確定資源會一致地管理,且會根據實際類型的規則進行解構,您應該定義公用虛擬解構函式。 如果類型階層設計為不允許用戶端程式代碼直接終結物件,解構函式應該定義為受保護的非虛擬。

備註

  • 警告會顯示在類型的第一個虛擬函式定義上(如果不是公用,它可以是虛擬解構函式),每個類型一次。

  • 由於定義可以與宣告分開放置,因此它不一定會有任何虛擬規範。 但警告仍然有效:它會檢查函式的實際「虛擬性」。

程式碼分析名稱: NEED_VIRTUAL_DTOR

範例

namespace no_destructor
{
    struct base {
        virtual void foo() {} // C26436, see remarks to understand the placement of the warning.
    };
}

當基類具有虛擬公用解構函式或受保護的非虛擬解構函式時,就不會顯示警告。

namespace virtual_destructor
{
    struct base {
        virtual ~base();
        virtual void foo() {}
    };
}
namespace protected_destructor
{
    struct base {
        virtual void foo() {}
    protected:
        ~base() {}
    };
}