TObject::BeforeDestruction - C++ Builder

C++ Builder 参考手册 ➙ System ➙ TObject ➙ BeforeDestruction


头文件:#include
命名空间:System
函数原型:

virtual void __fastcall BeforeDestruction(void);

System::TObject::BeforeDestruction 是 System::TObject 的成员函数。

  • TObject 执行析构函数之前会自动调用 BeforeDestruction,不要直接调用这个函数。
  • 在调用 BeforeDestruction 的时候,还没做任何销毁动作呢。
  • 只有当构造函数完整执行完成的情况下,析构之前才会调用 BeforeDestruction,如果在构造函数里面抛出了异常,会调用析构函数,但是不会调用 BeforeDestruction。
  • 重载这个函数可以处理析构函数调用之前需要运行的代码,例如 TCustomForm 利用重载的 BeforeDestruction 来产生 OnDestroy 事件。

例1:没有异常的情况,构造函数、析构函数、AfterConstruction、BeforeDestruction 的执行顺序

class TTestObjBase : public TObject
{
public:
    __fastcall TTestObjBase();
    __fastcall ~TTestObjBase();
    void __fastcall AfterConstruction(void);
    void __fastcall BeforeDestruction(void);
};
__fastcall TTestObjBase::TTestObjBase()
{
    Form1->Memo1->Lines->Add(L"父类:构造函数");
}
__fastcall TTestObjBase::~TTestObjBase()
{
    Form1->Memo1->Lines->Add(L"父类:析构函数");
}
void __fastcall TTestObjBase::AfterConstruction(void)
{
    TObject::AfterConstruction();
    Form1->Memo1->Lines->Add(L"父类:AfterConstruction");
}
void __fastcall TTestObjBase::BeforeDestruction(void)
{
    TObject::BeforeDestruction();
    Form1->Memo1->Lines->Add(L"父类:BeforeDestruction");
}
//---------------------------------------------------------------------------
class TTestObj : public TTestObjBase
{
public:
    __fastcall TTestObj();
    __fastcall ~TTestObj();
    void __fastcall AfterConstruction(void);
    void __fastcall BeforeDestruction(void);
};
__fastcall TTestObj::TTestObj()
{
    Form1->Memo1->Lines->Add(L"子类:构造函数");
}
__fastcall TTestObj::~TTestObj()
{
    Form1->Memo1->Lines->Add(L"子类:析构函数");
}
void __fastcall TTestObj::AfterConstruction(void)
{
    TTestObjBase::AfterConstruction();
    Form1->Memo1->Lines->Add(L"子类:AfterConstruction");
}
void __fastcall TTestObj::BeforeDestruction(void)
{
    TTestObjBase::BeforeDestruction();
    Form1->Memo1->Lines->Add(L"子类:BeforeDestruction");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TTestObj *obj;
    try
    {
        try
        {
            obj = new TTestObj;
        }
        __finally
        {
            delete obj;
        }
    }
    catch(Exception &e)
    {
        Memo1->Lines->Add(e.Message);
    }
}

运行结果:

没有异常的运行结果

例2:构造函数抛出异常的情况,构造函数、析构函数、AfterConstruction、BeforeDestruction 的执行顺序

class TTestObjBase : public TObject
{
public:
    __fastcall TTestObjBase();
    __fastcall ~TTestObjBase();
    void __fastcall AfterConstruction(void);
    void __fastcall BeforeDestruction(void);
};
__fastcall TTestObjBase::TTestObjBase()
{
    Form1->Memo1->Lines->Add(L"父类:构造函数");
}
__fastcall TTestObjBase::~TTestObjBase()
{
    Form1->Memo1->Lines->Add(L"父类:析构函数");
}
void __fastcall TTestObjBase::AfterConstruction(void)
{
    TObject::AfterConstruction();
    Form1->Memo1->Lines->Add(L"父类:AfterConstruction");
}
void __fastcall TTestObjBase::BeforeDestruction(void)
{
    TObject::BeforeDestruction();
    Form1->Memo1->Lines->Add(L"父类:BeforeDestruction");
}
//---------------------------------------------------------------------------
class TTestObj : public TTestObjBase
{
public:
    __fastcall TTestObj();
    __fastcall ~TTestObj();
    void __fastcall AfterConstruction(void);
    void __fastcall BeforeDestruction(void);
};
__fastcall TTestObj::TTestObj()
{
    Form1->Memo1->Lines->Add(L"子类:构造函数");
    throw Exception(L"这是子类构造函数抛出来的异常");
}
__fastcall TTestObj::~TTestObj()
{
    Form1->Memo1->Lines->Add(L"子类:析构函数");
}
void __fastcall TTestObj::AfterConstruction(void)
{
    TTestObjBase::AfterConstruction();
    Form1->Memo1->Lines->Add(L"子类:AfterConstruction");
}
void __fastcall TTestObj::BeforeDestruction(void)
{
    TTestObjBase::BeforeDestruction();
    Form1->Memo1->Lines->Add(L"子类:BeforeDestruction");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TTestObj *obj;
    try
    {
        try
        {
            obj = new TTestObj;
        }
        __finally
        {
            delete obj;
        }
    }
    catch(Exception &e)
    {
        Memo1->Lines->Add(e.Message);
    }
}

运行结果:

子类构造函数抛出异常的运行结果

通过上面截图的运行结果得出结论:
子类的构造函数抛出了异常,不会执行父类和子类的 AfterConstruction 和 BeforeDestruction,只执行了父类的析构函数,没有执行子类的析构函数。


参考:

  • System::TObject::AfterConstruction
  • System::TObject::TObject
  • System::TObject
  • VCL 类继承关系

C++ Builder 参考手册 ➙ System ➙ TObject ➙ BeforeDestruction

你可能感兴趣的:(TObject::BeforeDestruction - C++ Builder)