Share via


Warnung C26436

Der Typ "Symbol" mit einer virtuellen Funktion benötigt entweder öffentliche virtuelle oder geschützte nicht virtuelle Destruktor (c.35)

C++-Kernrichtlinien: C.35: Ein Basisklassen-Destruktor sollte entweder öffentlich und virtuell oder geschützt und nichtvirtual sein.

Wenn eine Klasse eine virtuelle Funktion definiert, wird sie polymorph, was bedeutet, dass abgeleitete Klassen ihr Verhalten ändern können, einschließlich Ressourcenverwaltungs- und Zerstörungslogik. Da Clientcode polymorphe Typen über Zeiger auf Basisklassen aufrufen kann, gibt es keine Möglichkeit, dass ein Client explizit auswählen kann, welches Verhalten ohne Downcasting geeignet ist. Um sicherzustellen, dass Ressourcen konsistent verwaltet werden und die Zerstörung gemäß den Regeln des tatsächlichen Typs erfolgt, sollten Sie einen öffentlichen virtuellen Destruktor definieren. Wenn die Typhierarchie so konzipiert ist, dass Clientcode Objekte direkt zerstört, sollten Destruktoren als geschützt definiert werden, die nicht virtuell geschützt sind.

Hinweise

  • Die Warnung wird in der ersten Definition einer virtuellen Funktion eines Typs angezeigt (es kann sich um einen virtuellen Destruktor, wenn er nicht öffentlich ist), einmal pro Typ.

  • Da eine Definition getrennt von einer Deklaration platziert werden kann, verfügt sie möglicherweise nicht immer über einen der virtuellen Bezeichner. Die Warnung ist jedoch weiterhin gültig: Sie überprüft die tatsächliche "Virtualität" einer Funktion.

Codeanalysename: NEED_VIRTUAL_DTOR

Beispiel

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

Die Warnung wird nicht angezeigt, wenn die Basisklasse über einen virtuellen öffentlichen Destruktor oder einen geschützten nicht virtuellen Destruktor verfügt.

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