Ao substituir uma classe em C ++ (com um destruidor virtual), estou implementando o destruidor novamente como virtual na classe herdada, mas preciso chamar o destruidor base?
Se sim, imagino que seja algo assim ...
MyChildClass::~MyChildClass() // virtual in header
{
// Call to base destructor...
this->MyBaseClass::~MyBaseClass();
// Some destructing specific to MyChildClass
}
Estou certo?
c++
destructor
Nick Bolton
fonte
fonte
delete
um ponteiro para a classe base duas vezes causa uma falha de segmentação?Não, você não precisa chamar o destruidor de base, um destruidor de base é sempre chamado pelo destruidor derivado. Por favor, veja minha resposta relacionada aqui para ordem de destruição .
Para entender por que você deseja um destruidor virtual na classe base, consulte o código abaixo:
Quando você faz:
Então, se você não tivesse um destruidor virtual em B, apenas ~ B () seria chamado. Mas como você tem um destruidor virtual, primeiro ~ D () será chamado, depois ~ B ().
fonte
O que os outros disseram, mas também observe que você não precisa declarar o destruidor virtual na classe derivada. Depois de declarar um destruidor virtual, como você faz na classe base, todos os destruidores derivados serão virtuais, independentemente de você o declarar ou não. Em outras palavras:
fonte
Não. Diferente de outros métodos virtuais, nos quais você explicitamente chamaria o método Base da derivada para 'encadear' a chamada, o compilador gera código para chamar os destruidores na ordem inversa na qual seus construtores foram chamados.
fonte
Não, você nunca chama o destruidor da classe base, ele sempre é chamado automaticamente como outros já apontaram, mas aqui está a prova de conceito com resultados:
A saída é:
Se você definir o destruidor da classe base como virtual, qual deve ser o resultado do caso 3, será o mesmo do caso 1 e 2.
fonte
Não. É chamado automaticamente.
fonte
Os destruidores no C ++ são chamados automaticamente na ordem de suas construções (Derivado e Base) somente quando o destruidor da classe Base é declarado
virtual
.Caso contrário, somente o destruidor da classe base será chamado no momento da exclusão do objeto.
Exemplo: sem destruidor virtual
Resultado
Exemplo: Com o Destructor virtual básico
Resultado
Recomenda-se declarar o destruidor da classe base,
virtual
caso contrário, isso causa um comportamento indefinido.Referência: Destructor Virtual
fonte