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;