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() {}
};
}