Aviso C26436

O tipo «símbolo» com uma função virtual necessita de um destruidor público, virtual ou não virtual protegido (c.35)

Diretrizes Principais do C++: C.35: um destruidor de classe base deve ser virtual e público, ou não virtual e protegido

Se uma classe definir uma função virtual, ela se tornará polimórfica, o que implica que classes derivadas podem alterar o próprio comportamento, incluindo gerenciamento de recursos e lógica de destruição. Como o código do cliente pode chamar tipos polimórficos por meio de ponteiros para classes base, não há como um cliente escolher explicitamente qual comportamento é apropriado sem downcasting. Para garantir que os recursos sejam gerenciados de forma consistente e que a destruição ocorra de acordo com as regras do tipo real, você deve definir um destruidor virtual público. Se a hierarquia de tipos for projetada para não permitir que o código do cliente destrua objetos diretamente, os destruidores deverão ser definidos como não virtuais protegidos.

Comentários

  • O aviso aparece na primeira definição de função virtual de um tipo (pode ser um destruidor virtual se não for público), uma vez por tipo.

  • Como uma definição pode ser colocada separadamente de uma declaração, ela nem sempre pode ter nenhum dos especificadores virtuais. Mas o aviso ainda é válido: ele verifica a real "virtualidade" de uma função.

Nome da análise de código: NEED_VIRTUAL_DTOR

Exemplo

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

O aviso não aparece quando a classe base tem um destruidor público virtual ou um destruidor não virtual protegido.

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