destructor virtual
En C ++, el constructor no se puede definir como un constructor ficticio, porque el constructor solo se llama cuando se crea una instancia de un objeto, y la implementación de la función virtual en realidad se llama a través de un puntero de tabla de funciones virtuales y no hay ninguna actualización del objeto. Por supuesto, no se puede llamar sin espacio de memoria, por lo que el constructor ficticio antes de crear una instancia de un objeto no tiene sentido y no se puede implementar.
Sin embargo, los destructores pueden ser funciones virtuales y la mayoría de las veces se declaran como destructores virtuales. De esta manera, cuando se libera el objeto de la clase derivada al que apunta el puntero de la clase base, el destructor de la subclase se puede compilar y llamar dinámicamente de acuerdo con el tipo de objeto real al que apunta, para lograr la liberación correcta de la memoria del objeto. .
Hagamos un experimento a continuación, mire el código:
/************************************//Des: Demostración del tutorial de C++//Autor: Huang/ /Copyright:www.dotcpp.com//Fecha:2017/12/27********************************* * ******* /#include<iostream>usingnamespacestd;classPoint{privado:intx,y;int*str;public:Point(intx=0,inty=0){this->x=x;this->y=y;str=newint [100];}~Punto(){eliminar e[]str;cout<<CalledPoint'sDestructorandDeletedstr!<<endl;}};classCircle:publicPoint{private:intr;int*str;public:Circle(intx,inty,intR):Point(x,y){r =R; str=newint[100];}~Circle(){delete[]str;cout<<CalledCircle'sDestructorandDeletedstr!<<endl;}};intmain(){Point*p;p=newCircle(10,10,20) ;eliminar;retorno0;}
Puede ver el código. No hay ningún destructor declarado con virtual en la clase base, y tanto la clase base como la clase derivada tienen una asignación de memoria dinámica. Luego creamos una clase Círculo en la función principal asignando memoria dinámicamente y luego la eliminamos. La captura de pantalla después de ejecutar es la siguiente:
Se puede ver claramente que solo se llama al destructor de la clase base, por lo que quedarán 4 * 100 bytes de nueva memoria en la clase derivada, ¡lo que provocará una pérdida de memoria!
Y si el destructor de la clase base se declara como virtual, ¡el resultado será muy diferente! En este momento, aparece el efecto polimórfico. Primero liberará el espacio de la clase derivada y luego liberará el espacio de memoria de la clase base. Termina perfectamente, como se muestra a continuación:
Arriba, estos son los beneficios que aporta el destructor virtual, puedes experimentarlo tú mismo.