2011-07-28 85 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 
{ 
} 

而對於新的析構函數將inherite ~TObject

__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'是Borland提供的系統類,它有一個虛擬析構函數。 –

+0

好的!所以這裏不應該有任何問題:〜TMyObject()和〜TObject()應該被調用,而不需要我們做任何特定的事情。 – Shlublu

+0

正確,它確實像預期的那樣工作。 –

4

當您的objet生命週期結束時,編譯器會自動調用基類的析構函數。你不需要明確地調用它。

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一個:

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

要對什麼樣的析構函數決定調用推遲到運行時,需要在TObject指定析構函數virtual。每當你有一個想要派生的類時,析構函數應該是虛擬的。否則,當派生類析構函數沒有正確調用時,總會有資源泄漏的風險。

+0

+1提虛擬析構函數 – Jaywalker

1

對您造成混淆的是,您可以具體提及您要使用的基類的「哪個」構造函數,如下例所示。但是你不能/不需要指定析構函數。

TMyObject::TMyObject() : TObject() 

你可以使用不同的構造,說TObject (int i)

TMyObject::TMyObject() : TObject (3) 

的對象只能以一種方式被破壞,但它可以通過多種方式來構建(由具有不同的構造函數)。

因此,簡而言之,您不需要在派生類析構函數中提及基類析構函數的名稱。只要你銷燬派生對象(比如說,通過做delete derivedObj),它將首先調用派生類析構函數,然後自己調用基類析構函數。