次の方法で共有


警告 C26436

仮想関数を持つ型 'symbol' には、パブリック仮想デストラクターまたは保護された非仮想デストラクターが必要です (c.35)

C++ Core Guidelines: C.35: 基本クラスのデストラクターは、パブリックと仮想、または保護と非仮想のいずれかである必要があります

クラスで仮想関数が定義されている場合は、ポリモーフィックになります。これは、派生クラスがリソース管理や破棄ロジックなど、その動作を変更できることを意味します。 クライアント コードは基底クラスへのポインターを介してポリモーフィック型を呼び出す可能性があるため、ダウンキャストを行わずに適切な動作をクライアントが明示的に選択することはできません。 リソースが一貫して管理され、実際の型の規則に従って破棄が発生することを確認するには、パブリック仮想デストラクターを定義する必要があります。 型階層が、クライアント コードでオブジェクトを直接破壊できないように設計されている場合は、デストラクターを保護された非仮想として定義する必要があります。

解説

  • 警告は、型の最初の仮想関数定義に表示されます (パブリックでない場合は仮想デストラクターになる可能性があります)。型ごとに 1 回。

  • 定義は宣言とは別に配置できるため、仮想指定子が常に存在するとは限りません。 ただし、警告は引き続き有効です。関数の実際の 'virtuality' をチェックします。

コード分析名: 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() {}
    };
}