Compartir vía


Advertencia C26436

El tipo 'symbol' con una función virtual necesita destructor público virtual o no virtual protegido (c.35)

C++ Core Guidelines: C.35: un destructor de clase base debe ser público y virtual, o protegido y no virtual.

Si una clase define una función virtual, se convierte en polimórfica, lo que implica que las clases derivadas pueden cambiar su comportamiento, incluida la lógica de destrucción y administración de recursos. Dado que el código de cliente puede llamar a tipos polimórficos a través de punteros a clases base, no hay ninguna manera de que un cliente pueda elegir explícitamente qué comportamiento es adecuado sin reducir la difusión. Para asegurarse de que los recursos se administran de forma coherente y que la destrucción se produce según las reglas del tipo real, debe definir un destructor virtual público. Si la jerarquía de tipos está diseñada para impedir que el código de cliente destruya objetos directamente, los destructores deben definirse como no virtuales protegidos.

Comentarios

  • La advertencia se muestra en la primera definición de función virtual de un tipo (puede ser un destructor virtual si no es público), una vez por tipo.

  • Dado que una definición se puede colocar por separado de una declaración, es posible que no siempre tenga ninguno de los especificadores virtuales. Pero la advertencia sigue siendo válida: comprueba la "virtualidad" real de una función.

Nombre del análisis de código: NEED_VIRTUAL_DTOR

Ejemplo

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

La advertencia no aparece cuando la clase base tiene un destructor público virtual o un destructor no virtual protegido.

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