[英]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.