No, nunca llama al destructor de la clase bese, que siempre es llamado automáticamente como otros han señalado, pero aquí es una prueba de concepto con resultados:
class base {
public:
base()
{
cout << __FUNCTION__ << endl;
}
~base()
{
cout << __FUNCTION__ << endl;
}
};
class derived : public base {
public:
derived()
{
cout << __FUNCTION__ << endl;
}
~derived()
{
cout << __FUNCTION__ << endl;
} // adding call to base::~base() here results in double call to base destructor
};
int main()
{
cout << "case 1, declared as local variable on stack" << endl << endl;
{
derived d1;
}
cout << endl << endl;
cout << "case 2, created using new, assigned to derive class" << endl << endl;
derived * d2 = new derived;
delete d2;
cout << endl << endl;
cout << "case 3, created with new, assigned to base class" << endl << endl;
base * d3 = new derived;
delete d3;
cout << endl;
return 0;
}
La salida es:
case 1, declared as local variable on stack
base::base
derived::derived
derived::~derived
base::~base
case 2, created using new, assigned to derive class
base::base
derived::derived
derived::~derived
base::~base
case 3, created with new, assigned to base class
base::base
derived::derived
base::~base
Press any key to continue . . .
Si configura el destructor de la clase base como uno virtual, entonces los resultados son los mismos que en el caso 1 & 2.
¿Qué hay de los destructores virtuales puros? Mi enlazador está tratando de llamarlo al final del destructor no virtual de mi clase heredada; – cjcurrie
no puede tener un destructor virtual puro sin un cuerpo. Solo dale un cuerpo vacío. Con un método virtual puro regular, la función principal se llama en su lugar, con destructores, todos son llamados, por lo que debe proporcionar un cuerpo. La = 0 solo significa que debe ser anulada, por lo que sigue siendo una construcción útil si la necesita. –
Esta pregunta podría estar relacionada y ayuda [questions/15265106/c-a-missing-vtable-error] (http://stackoverflow.com/questions/15265106/c-a-missing-vtable-error). –