Eliminar un objeto de clase derivado usando un puntero de tipo de clase base que tiene un destructor no virtual da como resultado un comportamiento indefinido. Para corregir esta situación, la clase base debe definirse con un destructor virtual. Por ejemplo, seguir el programa da como resultado un comportamiento indefinido.
CPP
// CPP program without virtual destructor // causing undefined behavior #include <iostream> using namespace std; class base { public: base() { cout << "Constructing base\n"; } ~base() { cout<< "Destructing base\n"; } }; class derived: public base { public: derived() { cout << "Constructing derived\n"; } ~derived() { cout << "Destructing derived\n"; } }; int main() { derived *d = new derived(); base *b = d; delete b; getchar(); return 0; }
Aunque la salida del siguiente programa puede ser diferente en diferentes compiladores, cuando se compila usando Dev-CPP, imprime lo siguiente:
Constructing base Constructing derived Destructing base
Hacer que el destructor de clase base sea virtual garantiza que el objeto de la clase derivada se destruya correctamente, es decir, se invocan tanto los destructores de clase base como los de clase derivada. Por ejemplo,
CPP
// A program with virtual destructor #include <iostream> using namespace std; class base { public: base() { cout << "Constructing base\n"; } virtual ~base() { cout << "Destructing base\n"; } }; class derived : public base { public: derived() { cout << "Constructing derived\n"; } virtual ~derived() { cout << "Destructing derived\n"; } }; int main() { derived *d = new derived(); base *b = d; delete b; getchar(); return 0; }
Producción:
Constructing base Constructing derived Destructing derived Destructing base
Como pauta, cada vez que tenga una función virtual en una clase, debe agregar inmediatamente un destructor virtual (incluso si no hace nada). De esta manera, te aseguras contra sorpresas posteriores.
Referencia: Codificación segura
Este artículo es una contribución de Rahul Gupta . 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