Llamar a métodos virtuales en constructor/destructor en C++

Requisito previo: función virtual en C++
Llamar funciones virtuales desde un constructor o destructor se considera peligroso la mayoría de las veces y debe evitarse siempre que sea posible. Todas las implementaciones de C++ deben llamar a la versión de la función definida en el nivel de la jerarquía en el constructor actual y no más. 
Puede llamar a una función virtual en un constructor. Los Objetos se construyen de base hacia arriba, “base antes de derivarse”.
 

CPP

// CPP program to illustrate
// calling virtual methods in
// constructor/destructor
#include<iostream>
using namespace std;
 
class dog
{
public:
    dog()
    {
        cout<< "Constructor called" <<endl;
        bark() ;
    }
 
    ~dog()
    {
        bark();
    }
 
    virtual void bark()
    {
        cout<< "Virtual method called" <<endl;
    }
 
    void seeCat()
    {
        bark();
    }
};
 
class Yellowdog : public dog
{
public:
        Yellowdog()
        {
            cout<< "Derived class Constructor called" <<endl;
        }
        void bark()
        {
            cout<< "Derived class Virtual method called" <<endl;
        }
};
 
int main()
{
    Yellowdog d;
    d.seeCat();
}

Producción: 
 

Constructor called
Virtual method called
Derived class Constructor called
Derived class Virtual method called
Virtual method called

Explicación: 
 

  • El método de ladrido en la clase de perro se invoca tanto en el constructor como en el destructor.
  • Cuando se crea el objeto de Yellowdog, se llama constructor de perro y luego de Yellowdog y en orden inverso a la llamada de destructor.
  • Aunque, el método ladrar es un método virtual, pero cuando se llama dentro del constructor, se comportará como un método no virtual porque en el momento en que se llama al constructor de la clase dog (base) como en el código anterior, la clase Yellowdog (derivada) no está construida por eso tiempo.
  • Por lo tanto, es peligroso llamar a la función miembro de la clase cuyo objeto aún no está construido y el compilador llama a la versión de clase de perro del método ladrar. Y lo mismo ocurre con el destructor, cuando el objeto ‘d’ de Yellowdog se destruye, primero se llama al destructor de la clase Yellowdog y luego se llama al destructor de la clase dog, pero en ese momento Yellowdog ya está destruido, por lo tanto, se llama la versión dog class de ladrido.

NOTA: Se recomienda encarecidamente evitar llamar a métodos virtuales desde constructor/destructor. 
Cuestionario sobre funciones virtuales
Este artículo es una contribución de Yash Singla . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *