Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: shephiroth en 01 de Febrero de 2007, 01:56:00 AM

Título: Problema con deletes
Publicado por: shephiroth en 01 de Febrero de 2007, 01:56:00 AM
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 ^_^
Título: Problema con deletes
Publicado por: AK47 en 01 de Febrero de 2007, 09:11:15 AM
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.
Título: Problema con deletes
Publicado por: shephiroth en 01 de Febrero de 2007, 01:18:09 PM
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.
Título: Problema con deletes
Publicado por: Vicente en 01 de Febrero de 2007, 01:24:21 PM
Porque quieres que llame al de las clases hijas?
Título: Problema con deletes
Publicado por: shephiroth en 01 de Febrero de 2007, 01:45:17 PM
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;
}
Título: Problema con deletes
Publicado por: Vicente en 01 de Febrero de 2007, 01:56:14 PM
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 ;)
Título: Problema con deletes
Publicado por: AK47 en 01 de Febrero de 2007, 03:13:00 PM
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;" ;)
Título: Problema con deletes
Publicado por: Fran en 06 de Febrero de 2007, 05:54:16 PM
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(){};

?
Título: Problema con deletes
Publicado por: shephiroth en 06 de Febrero de 2007, 06:13:19 PM
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 ^^;
Título: Problema con deletes
Publicado por: Lex en 06 de Febrero de 2007, 06:15:59 PM
...
Título: Problema con deletes
Publicado por: AK47 en 07 de Febrero de 2007, 09:46:57 AM
:x