繁体   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