2011-07-28 5 views
5

私は、Borland C++ Builderを使用しています。C++のデストラクタと継承?

と私は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 
{ 
} 

そして~TObjectをinheriteますその新しいデストラクタのために持っていましたか?

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

答えて

4

これはTObjectのレベルで解決できます。

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

あなたがいずれかを実行することができますこの方法:そのデストラクタは仮想である必要があり

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

または

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

どちらデストラクタ

が呼び出されます(その後、 ~TMyObject()最初と ~TObject())とあなた漏れはありません。

+0

'TObject'はボーランドが提供するシステムクラスであり、仮想デストラクタを持っています。 –

+0

だからここに問題はないはずです:〜TMyObject()と〜TObject()は、私たちが何もせずに呼び出す必要があります。 – Shlublu

+0

正解です。期待通りに動作します。 –

4

基本クラスのデストラクタは、オブジェクトのライフタイムが終了するとコンパイラによって自動的に呼び出されます。明示的に呼び出す必要はありません。

TMyObject::TMyObject() : TObject() 

コンストラクタを継承しません。
Member initializer listと呼ばれ、特定の値でBaseクラスオブジェクトを初期化します。

オブジェクトを作成するとき。

TMyObject obj; 

コンストラクタが順番に呼び出されます。

constructor of TObject 
constructor of TMyObject 

オブジェクトの寿命はデストラクタが順番に呼び出されます終了の場合:

destructor of TMyObject 
destructr of TObject 

コンパイラがためにそうします明示的に呼び出す必要はありません。

+0

私はそのようなものを望みます: – user558126

+0

__fastcall TMyObject ::〜TMyBoejct():〜TObject(){new code} – user558126

+0

@ user558126:私は恐れがあります。 –

1

TMyObjectの参照を介してTMyObjectを破壊すると、何もする必要はありません。あなたがタイプTObjectからTMyObjectへのポインタ/参照を持っている場合は、物事がうまくいかないでしょう。 のみTObjectデストラクタがTMyObject 1、いない呼び出されます。

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

実行時に延期に呼び出す何デストラクタの決定を持っているために、あなたはTObjectvirtualとしてデストラクタを指定する必要があります。派生することを意図したクラスがあるときはいつでも、デストラクタは仮想でなければなりません。それ以外の場合は、派生クラスのデストラクタが正しく呼び出されないと、リソースリークのリスクが常に発生します。

+0

仮想デストラクタに言及すると+1 – Jaywalker

1

あなたの混乱の原因は、次の例のように、基本クラスの "どの"コンストラクタを具体的に記述できるかということです。しかし、デストラクタを指定する必要はありません。あなたが別のコンストラクタを使用することができ

TMyObject::TMyObject() : TObject() 

は、一方向にのみ破壊することができ

TMyObject::TMyObject() : TObject (3) 

オブジェクトを書き込むことによってTObject (int i)を言うが、それは(別のコンストラクタを持つことで)いくつかの方法で構築することができます。

要するに、派生クラスのデストラクタで基本クラスのデストラクタの名前を言及する必要はありません。派生オブジェクトを破棄すると(例えば、delete derivedObjを実行することによって)、派生クラスのデストラクタを呼び出してから、それ自身で基本クラスのデストラクタを呼び出します。