Sunteți pe pagina 1din 4

Constructores y Destructores: Esta funcin se ejecuta cada vez que se crea un objeto de la clase.

De parecidas caractersticas existe una funcin, llamada destructor que se ejecuta cada vez que el objeto se destruye. Un objeto se destruye cuando se termina el programa, cuando se sale de una funcin (o bloque) que haba creado al objeto, o bien cuando indicamos con la instruccin delete, la liberacin de la memoria que habamos reservado dinmicamente para algn objeto. En todos estos casos se ejecuta el destructor del objeto. Este tambin lleva el nombre de la clase precedido por el smbolo ~. Hasta el momento no nos hizo falta definir nuestros propios destructores, pero como veremos ms adelante resulta muy til y necesario cuando los programas administran memoria dinmica y no son clases tan triviales como las que vimos. En el programa siguiente, crearemos la clase Prueba y le definiremos solamente un constructor y un destructor. Tambin poseer un dato miembro, que lo utilizaremos para diferenciar los diferentes objetos (objeto 0, objeto 1, etc). El constructor y el destructor, slo poseern una instruccin cout, que mostrar cuando se ejecuta uno u otro y adems dar el nmero de objeto para que podamos diferenciarlos. Presten especial atencin en los dos objetos creados dentro del bloque (el 1 y el 2). Se crea primero el objeto 1 y luego el objeto 2. Cuando se sale del bloque, los destructores se ejecutan en el orden inverso al que fueron creados, es decir primero el del objeto 2 y luego el del objeto 1.

#include <iostream> using std::cout; using std::endl; #include <new> class Prueba { public: Prueba(int numero = 0); //constructor. ~Prueba(); //destructor private: int x; }; //definiciones de las funciones miembro Prueba::Prueba(int numero)//constructor. { x = numero; cout << "Se ejecuta el constructor del objeto nro: " << (*this).x << endl; } Prueba::~Prueba() { cout << "Se ejecuta el DESTRUCTOR del objeto nro: " << (*this).x << endl; } int main() { cout << "***Entramos a main" << endl; Prueba objeto(0); { cout << "***Entramos al bloque" << endl; Prueba objetoA(1); Prueba objetoB(2); cout << "***Salimos del bloque" << endl; } Prueba *ptr; //creamos un puntero. ptr = new Prueba(3);//le asignamos un objeto dinamicamente, con argumento 3. Prueba *ptr2; ptr2 = new Prueba(4);//segundo puntero. //AHORA LIBERAMOS LA MEMORIA DINAMICA QUE HABIAMOS SOLICITADO, USANDO DELETE. cout << "--Borramos ptr2" << endl; delete ptr2; cout << "--Borramos ptr" << endl; delete ptr; cout << "***Ahora estamos por salir de main(), al salir se ejecutara el destructor" << endl << "del objeto 0 creado al principio de main()" << endl; return 0; }

Herencia Mltiple: La Herencia consiste en que una clase (subclase) comparte la estructura y/o comportamiento definidos en una (herencia simple) o ms (herencia mltiple) clases, llamadas superclases. En Java tenemos la habilidad, sin embargo, de utilizar una clase ya implementada y agregarle comportamiento y estado a esta. As, la nueva clase seria una extensin de la clase original. Ha esto le llamamos herencia. A pesar de que Java no provea herencia mltiple (capacidad de heredar de varias clases simultneamente) si permite que una clase extienda a una e implemente a otra. Java incluso permite implementar varias clases simultneamente enumerando todas las clases, separadas cada una por una coma. Problemas con la herencia En ocasiones es preciso que un objeto presente polimorfismo respecto a dos o ms clases base. Supongamos que tenemos la clase Cuadrupedo y la clase Mamifero. Estas clases no derivan una de la otra puesto que no todos los mamferos son cuadrpedos ni todos los cuadrpedos son mamferos. Si vamos a crear una clase Vaca, seguramente querremos que la clase Vaca presente polimorfismo tanto respecto a la clase Cuadrupedo como respecto a la clase Mamifero. Existen lenguajes, C++ es uno de ellos, que soportan herencia mltiple. Esto es, se puede derivar perfectamente el objeto Vaca de dos objetos base simultneamente, los objetos Mamifero y Cuadrupedo. La herencia mltiple resulta, sin embargo, problemtica. Supongamos que tanto el objeto Mamfero como el objeto Cuadrupedo derivan de una clase base comn, la clase Animal. Tenemos ahora que la clase Vaca deriva de Animal por dos vas distintas. Esto presenta un problema para el compilador ya que existen dos modos diferentes de convertir una referencia al objeto Vaca en una referencia al objeto Animal. La implementacin del polimorfismo mltiple por medio de la herencia mltiple es una fuente continua de errores. Existe otro problema menor relacionado con la herencia. Si creamos una clase por herencia de otra, el cdigo de la clase padre se incluye en el programa incluso en el caso de que nunca se vaya a usar. Es decir, la reutilizacin del cdigo puede ser deseable, pero en ocasiones se sobrecargan los mtodos de la clase derivada ya que se busca el polimorfismo pero n la reutilizacin del cdigo. Con la herencia ambas caractersticas van unidas, el cdigo de la clase base estar presente aunque no se use realmente.

#include <iostream> using namespace std; class ClaseA { public: ClaseA() : valorA(10) {} ClaseA(int va) : valorA(va) {} int LeerValor() const { return valorA; } protected: int valorA; }; class ClaseB { public: ClaseB() : valorB(20) {} ClaseB(int vb) : valorB(vb) {} int LeerValor() const { return valorB; } protected: int valorB; }; class ClaseC : public ClaseA, public: ClaseC(int va, int vb) : int LeerValorA() const { int LeerValorB() const { }; int main() { ClaseC CC(12,14); cout << CC.LeerValorA() << "," << CC.LeerValorB() << endl; return 0; } public ClaseB { ClaseA(va), ClaseB(vb) {}; return ClaseA::LeerValor(); } return ClaseB::LeerValor(); }

S-ar putea să vă placă și