Destructor virtual en C ++

Destructor virtual en C ++
C ++ es el lenguaje que se utiliza para dar una base en el concepto básico de programación y hace que el pensamiento lógico de los programadores sea fuerte. En C ++, OOP juega un papel vital ya que OOP es un lenguaje orientado a objetos que crea los objetos de las clases. En OOP, estudiamos las clases y objetos. Las clases contienen los miembros de datos que son variables de diferentes tipos y diferentes funciones de miembros. Con la ayuda de instancias, accedemos a los datos de cualquier clase. Cada clase tiene su constructor y destructor cuando crea la clase. El constructor se llama en sí mismo cuando se crea el objeto de esa clase. También podemos inicializar las variables de una clase dentro del constructor. Los destructores también se crean automáticamente con el constructor, pero los destructores destruyen el objeto y es la última función que se llama antes de destruir el objeto. Se crea el nombre de la clase, por ejemplo, la clase de "profesión". Su constructor es profesión () y el destructor es ~ profesión (). Los tres tienen el mismo nombre.

Después de hablar sobre el OOP, los constructores y los destructores, ahora hablemos de los destructores virtuales. Los destructores virtuales, como especifican el nombre, destruye el objeto. Tenemos una clase base y una clase derivada que se deriva de la clase base. Ambas clases tienen sus constructores y destructores. El destructor virtual libera la reminiscencia que se asigna a través del objeto de clase derivado mientras elimina los objetos de la clase derivada utilizando un puntero de clase base con la palabra clave "virtual".

¿Por qué usamos el destructor virtual??

Cuando se realiza la ejecución de las funciones del miembro de la clase o la ejecución del método main () está a punto de finalizar, el destructor se llama automáticamente para liberar la memoria que se asigna durante la creación del objeto. Ahora, ¿por qué usamos un destructor virtual?? Cuando se elimina la clase base que apunta a la clase derivada, el puntero (*) se usa aquí. El destructor de la clase base solo se llama durante este proceso. El destructor de clase derivado no se llama lo que conduce a problemas. Uno de ellos es un problema de fuga de memoria. Para evitar este problema y hacer que nuestro código sea seguro, prácticamente destruimos los objetos para liberar el espacio de memoria que se asignó durante la creación de objetos eliminando el destructor de clase base.

C ++ Ejemplo básico sin destructor virtual

Veamos cómo funciona el programa sin un destructor virtual con un programa simple que elimina el puntero.

Código:

#incluir
usando el espacio de nombres STD;
clase parent_class0

público:
Parent_class0 ()
Cout<< "Parent Class Constructor" <~ Parent_class0 ()
Cout<< "Parent Class Destructor" <;
Clase Child_1: Public Parent_Class0

público:
Child_1 ()
Cout<< "Child Class Constructor" <~ Child_1 ()
Cout<< "Child Class Destructor" <;
int main ()

Parent_class0*pointer = new Child_1 ();
Eliminar puntero;
regresar 0;

Este código explica cómo se ejecuta el código sin un destructor virtual. En primer lugar, cree una clase llamada "Parent_class0" que será la clase principal. Dentro de esta clase, crea un constructor y destructor. Como sabemos, el constructor y el destructor se nombran igual que la clase. El destructor se representa de manera similar al constructor pero tiene un símbolo (~) que lo diferencia del constructor. Dentro del constructor y destructor, imprima un mensaje usando "Cout<<”. Now, create another class which is “Child_1”. This class is derived from the parent class, “Parent_Class0”. The derived class has its constructor and destructor that contain a message to print on the output screen.

En el método main (), creamos una instancia del "parent_class0" y le asignamos una clase derivada. El punto crucial para recordar en este caso es que utilizamos un puntero para recuperar la clase principal. Cuando entra dentro de la clase principal, ejecuta el constructor de la clase principal. Luego, va a la clase infantil y ejecuta su constructor. Antes de ejecutar el destructor de la clase infantil, tiene que ejecutar el destructor de la clase principal. El compilador ejecuta el destructor de la clase principal y termina la clase sin ejecutar el destructor de una clase de niños. Ese es el problema; No libera el recuerdo de la clase del niño. Representa el constructor de una clase madre, el constructor de una clase infantil y el destructor de una clase padre. Eso muestra que el destructor de una clase infantil no se ejecuta. Después de esta ejecución, eliminamos el puntero en la función principal ().

Producción:

Ejemplo de C ++ con destructor virtual

Discutamos el destructor virtual con un código simple para diferenciar cómo funciona con y sin un destructor virtual.

Código:

#incluir
usando el espacio de nombres STD;
clase parent_class0

público:
Parent_class0 ()
Cout<< "Parent Class Constructor" <virtual ~ parent_class0 ()
Cout<< "Parent Class Destructor" <;
Clase Child_1: Public Parent_Class0

público:
Child_1 ()
Cout<< "Child Class Constructor" <virtual ~ child_1 ()
Cout<< "Child Class Destructor" <;
int main ()

Parent_class0*pointer = new Child_1 ();
Eliminar puntero;
regresar 0;

El primer programa explicó el problema que nos enfrentamos sin un destructor virtual. Ahora, este código resolverá ese problema usando un destructor virtual. Primero, copie el primer código y simplemente agregue una palabra clave en dos lugares en este programa. Esa palabra es "virtual". Inserte esta palabra con el destructor de la clase principal, "Parent_class0". Del mismo modo, mencione esto con el destructor de la clase infantil que es "Child_1" que se deriva de la clase principal. Esta palabra clave "virtual" hace un pequeño cambio y ejecuta el destructor de la clase infantil "Child_1" primero. Luego, ejecuta el destructor de la clase principal, "Parent_class0". El resto del programa funciona de la misma manera que funciona sin un destructor virtual. Al agregar este pequeño código, podemos guardar nuestra memoria de la fuga. Ahora, muestra cuatro mensajes en la consola. Primero, el constructor de una clase matriz, luego el constructor de una clase infantil, el destructor de una clase infantil y el destructor de una clase madre. Al final, eliminamos el puntero dentro del método Main ().

Producción:

C ++ Ejemplo de destructor virtual puro

En este código, hablaremos sobre el destructor virtual puro, cómo funciona y cómo es diferente de un destructor virtual.

Código:

#incluir
Clase Parent_0
público:
virtual ~ parent_0 () = 0;
;
Parent_0 :: ~ parent_0 ()

std :: cout<< "Hello I am Pure Destructor. You Called Me!";

Clase Child_0: Public Parent_0
público:
~ Child_0 () std :: cout<< "Derived destructor is here\n";
;
int main ()

Parent_0* ptr_0 = new Child_0 ();
eliminar ptr_0;
regresar 0;

La clase principal "Parent_0" se crea en el primer paso del código. Dentro de él, cree el destructor de padres virtuales y asignarlo con 0. Esto establece el destructor virtual en puro destructor virtual, lo que significa que la clase principal ahora es abstracta y no podemos crear las instancias de esta clase. Fuera de la clase principal "Parent_0", defina los destructores y std :: cout. El texto requerido se muestra utilizando el std :: cout. Luego, deriva una clase "Child_0" de la clase principal y defina su destructor. Dentro del destructor, imprima un mensaje. En la función main (), cree el puntero de la clase principal y asigne la clase de niños.

El compilador va a la clase principal "Parent_0". Cuando se crea el puntero, su constructor se llama automáticamente. Luego, el compilador entra en la clase infantil para invocar su constructor. Después de la ejecución exitosa del constructor, ejecuta el destructor de una clase infantil "Child_0". Luego, ejecuta el destructor de una clase matriz. De esta manera, podemos hacer un destructor virtual puro. No se alienta a utilizarlo porque al emplear este método, la clase principal se vuelve abstracta, lo que lo hace inútil. La metodología que se usa principalmente es el destructor virtual y es una buena práctica.

Producción:

Conclusión

Aprendimos sobre el destructor virtual a partir del concepto de OOP hasta avanzar hacia los constructores y destructores. Después de explicar todo esto, discutimos sobre el destructor virtual en detalle con ejemplos de codificación y destructor virtual puro. Antes de explicar el destructor virtual, debemos saber sobre los constructores, destructores y herencia. En herencia, heredamos las clases de una clase principal. Las clases de los niños pueden ser más de uno, pero la clase principal es solo una. Los destructores virtuales y los destructores virtuales puros se aplican en herencia para ahorrar de la fuga de memoria. Desde el ejemplo básico hasta el ejemplo avanzado, cubrimos todo lo que debe saber para comenzar a usar y prácticamente destruir la memoria de la clase derivada.