destruidor virtual
Em C++, o construtor não pode ser definido como um construtor fictício, porque o construtor é chamado apenas quando um objeto é instanciado, e a implementação da função virtual é realmente chamada através de um ponteiro de tabela de função virtual, e não há atualização de objeto. é claro que ele não pode ser chamado sem espaço de memória; portanto, o construtor fictício antes de instanciar um objeto não tem sentido e não pode ser implementado.
No entanto, os destruidores podem ser funções virtuais e, na maioria das vezes, são declarados como destruidores virtuais. Desta forma, quando o objeto da classe derivada apontado pelo ponteiro da classe base é liberado, o destruidor da subclasse pode ser compilado dinamicamente e chamado de acordo com o tipo de objeto real apontado, de modo a obter a liberação correta da memória do objeto .
Vamos fazer um experimento abaixo, veja o código:
/************************************//Des: demonstração do tutorial C++//Autor: Huang/ /Direitos autorais:www.dotcpp.com//Data:2017/12/27********************************* * *******/#include<iostream>usingnamespacestd;classPoint{private:intx,y;int*str;public:Point(intx=0,inty=0){this->x=x;this- > y=y;str=newint[100];}~Point(){delete[]str;cout<<CalledPoint'sDestructorandDeletedstr!<<endl;}};classCircle:publicPoint{private:intr;int*str;public : Círculo(intx,inty,intR):Point(x,y){r=R;str=newint[100];}~Circle(){delete[]str;cout<<CalledCircle'sDestructorandDeletedstr!<<endl; } };intmain(){Ponto*p;p=newCircle(10,10,20);deletep;return0;}
Você pode ver o código. Não há nenhum destruidor declarado com virtual na classe base, e tanto a classe base quanto a classe derivada têm alocação dinâmica de memória. Em seguida, criamos uma classe Circle na função principal alocando memória dinamicamente e, em seguida, excluímos. A captura de tela após a execução é a seguinte:
Pode-se ver claramente que apenas o destruidor da classe base é chamado, de modo que os 4*100 bytes de nova memória na classe derivada permanecerão, causando um vazamento de memória!
E se o destruidor da classe base for declarado como virtual, o resultado será bem diferente! Nesse momento, aparece o efeito polimórfico. Ele primeiro libera o espaço da classe derivada e depois libera o espaço de memória da classe base. Termina perfeitamente, conforme mostrado abaixo:
Acima, esses são os benefícios trazidos pelo destruidor virtual, você mesmo pode experimentar.