簡體   English   中英

C ++中的析構函數和繼承?

[英]Destructors and inheritance in C++?

我使用Borland C ++ Builder。

我有問題

#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新析構函數?

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

當您的對象生命周期結束時,編譯器將自動調用Base類的析構函數。 你不需要明確地調用它。

TMyObject::TMyObject() : TObject()

不繼承構造函數。
它被稱為成員初始化列表 ,它使用特定值初始化Base類對象。

創建對象時。

TMyObject obj;

構造函數將按順序調用:

constructor of TObject
constructor of TMyObject 

當對象生命周期結束時,將按順序調用析構函數:

destructor of TMyObject 
destructr of TObject

編譯器會為您執行此操作,不需要顯式調用它。

這可以在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() ),你就沒有泄漏。

如果通過TMyObject類型的引用銷毀TMyObject ,則不必執行任何操作。 如果你有一個TObject類型的指針/引用到TMyObject會出錯。 調用TObject析構函數,而不是TMyObject

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

要決定要調用的析構函數延遲到運行時,需要在TObject中將析構函數指定為virtual 每當你有一個旨在派生的類時,析構函數應該是虛擬的。 否則,在未正確調用派生類析構函數時,始終存在資源泄漏的風險。

導致混淆的是,您可以在下面的示例中特別提及要使用的基類的“哪個”構造函數。 但是你不能/不需要指定析構函數。

TMyObject::TMyObject() : TObject()

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

TMyObject::TMyObject() : TObject (3)

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

因此,簡而言之,您不需要在派生類析構函數中提及基類析構函數的名稱。 一旦銷毀派生對象(例如,通過delete derivedObj ),它將首先調用派生類析構函數,然后自行調用基類析構函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM