Al anular una clase en C ++ (con un destructor virtual), estoy implementando el destructor nuevamente como virtual en la clase heredada, pero ¿necesito llamar al destructor base?
Si es así, me imagino que es algo así ...
MyChildClass::~MyChildClass() // virtual in header
{
// Call to base destructor...
this->MyBaseClass::~MyBaseClass();
// Some destructing specific to MyChildClass
}
Estoy en lo cierto?
c++
destructor
Nick Bolton
fuente
fuente
delete
a un puntero a la clase base dos veces causa una falla de segmentación?No, no necesita llamar al destructor base, el destructor derivado siempre llama a un destructor base. Vea mi respuesta relacionada aquí para el orden de destrucción .
Para comprender por qué desea un destructor virtual en la clase base, consulte el código a continuación:
Cuando tu lo hagas:
Entonces, si no tuviera un destructor virtual en B, solo se llamaría ~ B (). Pero como tiene un destructor virtual, primero se llamará a ~ D (), luego a ~ B ().
fuente
Lo que dijeron los demás, pero también tenga en cuenta que no tiene que declarar el destructor virtual en la clase derivada. Una vez que declara un destructor virtual, como lo hace en la clase base, todos los destructores derivados serán virtuales, ya sea que los declare o no. En otras palabras:
fuente
No. A diferencia de otros métodos virtuales, donde llamaría explícitamente al método Base de Derivado para 'encadenar' la llamada, el compilador genera código para llamar a los destructores en el orden inverso en el que se llamaron sus constructores.
fuente
No, nunca se llama destructor de clase base, siempre se llama automáticamente como otros han señalado, pero aquí hay una prueba de concepto con resultados:
El resultado es:
Si configura el destructor de clase base como virtual, cuál debería ser, entonces los resultados del caso 3 serían los mismos que los casos 1 y 2.
fuente
No. Se llama automáticamente.
fuente
Los destructores en C ++ se invocan automáticamente en el orden de sus construcciones (Derivado luego Base) solo cuando se declara el destructor de clase Base
virtual
.De lo contrario, solo se invoca el destructor de la clase base en el momento de la eliminación del objeto.
Ejemplo: sin destructor virtual
Salida
Ejemplo: con Destructor virtual base
Salida
Se recomienda declarar el destructor de clase base ya que de lo
virtual
contrario, causa un comportamiento indefinido.Referencia: Destructor virtual
fuente