C+中的析构函数与继承+;? 我使用Borland C++ +Builder。

C+中的析构函数与继承+;? 我使用Borland C++ +Builder。,c++,destructor,c++builder,C++,Destructor,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

我没有问题

#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
{
}

当您的objet生命周期结束时,编译器将自动调用基类的析构函数。您不需要显式地调用它

TMyObject::TMyObject() : TObject()
不继承构造函数。
它被称为,它用一个特定的值初始化基类对象

创建对象时

TMyObject obj;
将按顺序调用构造函数:

constructor of TObject
constructor of TMyObject 
当对象生命周期结束时,将按以下顺序调用析构函数:

destructor of TMyObject 
destructr of TObject

编译器将为您执行此操作,无需显式调用。

如果您通过
TMyObject
类型的引用销毁
TMyObject
,则无需执行任何操作。如果您有指向
TMyObject
TObject
类型的指针/引用,则会出现问题。只调用
TObject
析构函数,而不调用
TMyObject
一个:

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

要将调用哪个析构函数的决定推迟到运行时,您需要在
TObject
中将析构函数指定为
virtual
。每当您有一个要从中派生的类时,析构函数都应该是虚拟的。否则,当派生类析构函数调用不正确时,总是存在资源泄漏的风险。

导致您困惑的是,您可以在下面的示例中特别提到要使用的基类的“哪个”构造函数。但是您不能/不需要指定析构函数

TMyObject::TMyObject() : TObject()
您可以通过编写

TMyObject::TMyObject() : TObject (3)
一个对象只能以一种方式被破坏,但它可以以多种方式构造(通过使用不同的构造函数)


因此,简而言之,您不需要在派生类析构函数中提及基类析构函数的名称。一旦您销毁派生对象(例如,通过执行删除派生对象),它将首先调用派生类析构函数,然后自己调用基类析构函数。

这可以在
TObject
级别解决。其析构函数必须是虚拟的:

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


两个析构函数都将被调用(
~TMyObject()
,然后再调用
~TObject()
),这样您就不会有泄漏。

我希望这样:@user558126:恐怕这是不可能的。不,这是不可能的。无论如何,您不必显式地调用
TObject
的析构函数,因为这里没有新的位置。但是您提到的(执行~TMyObject(),然后执行~TObject())是通过在~TObject()级别使用virtual自动完成的。
TObject
是Borland提供的系统类,它确实有一个虚拟析构函数。好的!所以这里不应该有任何问题:~TMyObject()和~TObject()应该在我们不做任何具体事情的情况下被调用。所以这个问题没有根据,最后?是的。原始代码片段将按原样正常工作<代码>~TMyObject()在对象释放时自动调用,编译器将在
~TMyObject()
末尾处理调用
~TObject()
。我同意Remy的观点,但我认为
~TMyObject()
应该是虚拟的。
TObject * pobj = new TMyObject();
delete pobj;
TMyObject * pobj = new TMyObject();
delete pobj;