Partager via


Avertissement C26436

Le type 'symbol' avec une fonction virtuelle a besoin d’un destructeur virtuel public ou non virtuel protégé (c.35)

Instructions principales C++ : C.35 : Un destructeur de classe de base doit être public et virtuel, ou protégé et non virtuel

Si une classe définit une fonction virtuelle, elle devient polymorphe, ce qui implique que les classes dérivées peuvent modifier son comportement, y compris la logique de gestion des ressources et de destruction. Étant donné que le code client peut appeler des types polymorphes via des pointeurs vers des classes de base, il n’existe aucun moyen pour un client de choisir explicitement le comportement approprié sans la mise en page. Pour vous assurer que les ressources sont gérées de manière cohérente et que la destruction se produit en fonction des règles du type réel, vous devez définir un destructeur virtuel public. Si la hiérarchie de types est conçue pour interdire au code client de détruire directement des objets, les destructeurs doivent être définis comme étant protégés non virtuels.

Notes

  • L’avertissement s’affiche sur la première définition de fonction virtuelle d’un type (il peut s’agir d’un destructeur virtuel s’il n’est pas public), une fois par type.

  • Étant donné qu’une définition peut être placée séparément d’une déclaration, elle n’a peut-être pas toujours de spécificateurs virtuels. Mais l’avertissement est toujours valide : il vérifie la « virtualité » réelle d’une fonction.

Nom de l’analyse du code : NEED_VIRTUAL_DTOR

Exemple

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

L’avertissement n’apparaît pas lorsque la classe de base a un destructeur public virtuel ou un destructeur non virtuel protégé.

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