2011-07-28 19 views
5

Uso Borland C++ Builder.Destructores y herencia en C++?

y tuve un problema o

#include <Classes.hpp> 
class TMyObject : public TObject 
{ 
    __fastcall TMyObject(); 
    __fastcall ~TMyObject();//I would like to inherite my destructor from TObject 
}; 

__fastcall TMyObject::TMyObject() : TObject()//it will inherited my constructor from TObject 
{ 
} 

Y para ese nuevo destructor que inherite ~TObject?

__fastcall TMyObject::~TMyObject????????????? 

Respuesta

4

Esto se puede resolver en el nivel TObject. Su destructor tiene que ser virtual:

#include <Classes.hpp> 
class TObject 
{ 
    __fastcall TObject(); 
    virtual __fastcall ~TObject(); 
}; 

De esta manera usted puede hacer: se le llamará

TObject * pobj = new TMyObject(); 
delete pobj; 

o

TMyObject * pobj = new TMyObject(); 
delete pobj; 

Ambos destructores (~TMyObject() primero y luego ~TObject()) y no tendrá fugas

+0

'TObject' es una clase de sistema proporcionada por Borland, y tiene un destructor virtual. –

+0

Ok! Por lo tanto, no debería haber ningún problema aquí: ~ Deberían llamarse TMyObject() y ~ TObject() sin nosotros para hacer algo específico. – Shlublu

+0

Correcto, y funciona así como se esperaba. –

4

destructor de la clase base será llamado automáticamente por el compilador, cuando termina su tiempo de vida objet. no es necesario que lo llame explícitamente.

TMyObject::TMyObject() : TObject() 

No hereda el constructor.
Se llama como Member initializer list e inicializa el objeto de la clase Base con un valor particular.

Cuando crea el objeto.

TMyObject obj; 

Los constructores serán llamados en orden:

constructor of TObject 
constructor of TMyObject 

Cuando termina el tiempo de vida de objetos a los destructores serán llamados en el orden:

destructor of TMyObject 
destructr of TObject 

el compilador hacerlo por usted, no necesita llamarlo explícitamente.

+0

Me gustaría algo como eso: – user558126

+0

__fastcall TMyObject :: ~ TMyBoejct(): ~ TObject() {código nuevo} – user558126

+0

@ user558126: Me temo que no es posible. –

1

Si destruye un TMyObject a través de una referencia de tipo TMyObject, no tiene que hacer nada. En caso de que tenga un puntero/referencia de tipo TObject a TMyObject, las cosas saldrán mal. Sólo el destructor TObject serán llamados, no el TMyObject uno:

TObject* p = new TMyObject; 
delete p; // Only the TObject::~TObject is called, not TMyObject::~TMyObject. 

a que la decisión sobre qué destructor para llamar diferido a tiempo de ejecución, es necesario especificar el destructor como virtual en TObject. Siempre que tenga una clase de la que se pretende derivar, el destructor debe ser virtual. De lo contrario, siempre existe el riesgo de fugas de recursos cuando el destructor de clases derivado no se llama correctamente.

+0

+1 por mencionar destructor virtual – Jaywalker

1

Lo que le causa confusión es que puede mencionar específicamente el "constructor" de la clase base que desea usar como en el siguiente ejemplo. Pero no puede/no necesita especificar el destructor.

TMyObject::TMyObject() : TObject() 

Se puede usar un constructor diferente, dicen TObject (int i) escribiendo

TMyObject::TMyObject() : TObject (3) 

un objeto puede ser destruido en un solo sentido, pero se pueden construir de varias maneras (por tener diferentes constructores).

Por lo tanto, en resumen, no necesita mencionar el nombre del destructor de la clase base en el destructor de la clase derivada. Tan pronto como destruya el objeto derivado (por ejemplo, al hacer delete derivedObj), primero llamará al destructor de clase derivado y luego al destructor de clase base por sí mismo.