Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O tipo 'símbolo' com uma função virtual precisa de destruidor virtual público ou não virtual protegido (c.35)
Diretrizes principais do C++: C.35: Um destruidor de classe base deve ser público e virtual, ou protegido e não virtual
Se uma classe define uma função virtual, ela se torna polimórfica, o que implica que as classes derivadas podem mudar seu 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 impedir que o código do cliente destrua objetos diretamente, os destruidores devem ser definidos como não virtuais protegidos.
Observações
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.
Uma vez que uma definição pode ser colocada separadamente de uma declaração, nem sempre pode ter qualquer um dos especificadores virtuais. Mas o aviso ainda é válido: 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() {}
};
}