Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema con deletes

Iniciado por shephiroth, 01 de Febrero de 2007, 01:56:00 AM

« anterior - próximo »

shephiroth

Buenas.

Otra de mis dudas.....se puede virtualizar el delete de alguna manera?? Me refiero a las llamadas a ~claseBase(), que llame a los ~claseHija.

Siempre me queda hacer un virtual void eliminar(); a la que llamo antes del delete, pero por curarme en salud ^_^

AK47

Sí claro, se hace de la siguiente forma:


class Base
{
public:
   Base(...);
   virtual ~Base(){}
}

class Derived : public Base
{
public:
   Derived(...);
   ~Derived();
}


Así, cuando instancies un nuevo objeto de clase Derived y más tarde hagas delete de esa instancia, se llamara a ~Derived(), y de ahí se llamará a ~Base(). Al fin al cabo, lo que haces con delete es llamar a una función especial (al destructor), y por lo bajini el compilador libera la memoria que usaba ese objeto. Por eso hay que poner SIEMPRE el destructor en las clases base como virtual.

shephiroth

Lo debi de explicar mas, no quiero que vaya hacia la clase base sino hacia las clases hijas:


class Base
{
public:
   Base(...);
   virtual ~Base(){}
}

class Derived : public Base
{
public:
   Derived(...);
   ~Derived();
}
void main()
{
Base * uno = new Derived();
delete uno;
}

El delete uno llama a ~Base y quiero q llame a ~Derived.

Vicente

Porque quieres que llame al de las clases hijas?

shephiroth

Sigamos con el ejemplo:

struct derived_varios_t
{
...
};
class Base
{
public:
   Base(...);
   virtual ~Base(){}
}

class Derived : public Base
{
private:
   derived_varios_t * aux;
public:
   Derived(...){aux= new derived_varios_t[10];}
   ~Derived(){delete[] aux;}
}
void main()
{
Base * uno = new Derived();
delete uno;
}

Vicente

Yo no se C++, pero en C#/Java, la ligadura de tipos es dinámica, aunque uno este declarado de la clase Base, en realidad ese objeto es de la clase Derived, con lo cual se llama al destructor de Derived, porque es el tipo real de la variable.

Apuesto a que en C++ es así también.

Un saludo!

Vicente

P.D.: pon un par de cout o lo que sea para ver en que orden se llaman y listo ;)

AK47

Creo que mi respuesta era lo que buscabas, llamar al destructor de la clase derivada con un puntero a la clase base, que se consigue declarando virtual el destructor de la base. Lo que me asombra es que en el ejemplo que has puesto no llame a ~Derived(). Si no he pasado algún detalle por alto, debiera ser así. ¿Cómo compruebas que no llama a ~Derived()?

PD: De paso de te recomiendo que tires de las STL y uses el sdt::vector, asi te ahorrarás hacer el "delete[] aux;" ;)

Fran

No recuerdo bien C++ y creo q no debería darte problemas lo q estás haciendo, pero has probado a definir

~base();

en vez de:

~base(){};

?

shephiroth

Ya ni me acordaba de este post. El problema ya esta solucionado, y era tan simple como que me olvide de poner el virtual en la clase base ^^;


AK47







Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.