Destructores virtuales C++

Última modificación el Viernes, 24 abril 2009 07:59 Autor: ProgramadorWeb Miércoles, 27 agosto 2008 07:56

Destructores virtuales


C++ es un lenguaje orientado a objetos en el que es posible definir nuevas clases a partir de otras ya existentes, usando para ello un mecanismo de herencia. Esta técnica, conjuntamente con el polimorfismo, permite reutilizar código de una manera bastante eficiente. En la herencia y el polimorfismo juegan un papel importante los métodos virtuales, pero la mayoría de los programadores pasan por alto el hecho de que los destructores también deben ser virtuales.


En lugar de explicar con palabras el motivo de esa necesidad, veámoslo mejor con un ejemplo bastante claro. Partamos de la definición de las dos clases siguientes:


class Base {


protected:


int N;


public:


Base() : N(6) {}


~Base()


{ ShowMessage(N); }


};


class Derivada : public Base {


public:


Derivada() {}


~Derivada() { N /= 2; }


};


Con el fin de simplificar, toda la implementación se encuentra en línea dentro de la misma definición de clases. La clase Base cuenta con un miembro protegido, accesible por tanto para Derivada, al que asigna un valor inicial. Cuando el objeto es destruido se muestra el valor que tiene en ese momento. Puesto que en la clase Base no se manipula la variable, siempre que se destruya un objeto de este tipo el valor será el mismo dado inicialmente.


En la clase Derivada, que tiene como base a la anterior, se modifica el valor de N en el destructor, dividiéndolo entre dos. Si creamos un objeto de esta clase y a continuación lo destruimos, el valor de N mostrado en el destructor de Base será 3 y no 6, como es lógico. Compruébelo ejecutando las sentencias siguientes:


Base *Objeto1 = new Base();


delete Objeto1;


Derivada *Objeto2 = new Derivada();


delete Objeto2;


La técnica conocida como polimorfismo permite usar objetos de distintas clases, pero con una base común, de manera genérica. Es posible, por ejemplo, asignar una referencia de tipo Derivada a un puntero Base. Al destruir esa referencia, sin embargo, los destructores no se ejecutan en el orden correcto y el valor mostrado no es 3 sino 6, lo cual indica que se ejecutó el destructor Base antes que el destructor Derivada. Esto es anormal, puesto que el objeto era de la clase Derivada.


Para solucionar este problema basta con anteponer la palabra virtual en la definición del destructor de la clase base, lo cual implicará que el destructor sea virtual en todas las clases derivadas. Es algo que puede tomar como norma: defina los destructores siempre como virtuales, le evitará problemas.




Si te ha parecido interesante únete a nuestra comunidad de FACEBOOK y compartelo con tus amigos.





Articulos relacionados:


No olvides compartir Destructores virtuales C++ en tus redes sociales :-)
     

1 Comentario

  1. Raul   |  Martes, 30 junio 2009 a 2:49 pm

    Muchas gracias

Enviar comentario