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