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 ^_^
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.
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.
Porque quieres que llame al de las clases hijas?
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;
}
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 ;)
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;" ;)
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(){};
?
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 ^^;
...
:x