معمولا از Destructor ها برای آزاد کردن حافظه های اختصاص یافنه کلاس ها و کارهای پاک سازی اونها استفاده میشه .
این کد رو نگاه کن :
#include <iostream>
using namespace std;
class Base
{
public :
Base() { cout<<"Base::Base()"<<endl; }
~Base() { cout<<"Base:~Base()"<<endl; }
};
class Derived : public Base
{
public:
Derived() { cout<<"Derived::Derived()"<<endl; }
~Derived() { cout<<"Derived::~Derived()"<<endl; }
};
int main ()
{
Derived* obj = new Derived;
delete obj;
cin.get();
return 0;
}
اگر شماهمچین کلاس هایی داشته باشید . یعنی اشاره گری از نوع کلاس پایه داشته باشید که در واقع به کلاس
مشتق شده اشاره کنه . وقتی که شما اون اشاره گر رو بخواید delete کنید . چون نوع اشاره گر شما از کلاس پایه هست فقط تابع
Destructor کلاس پایه فراخوانی میشه . تابع Destructor کلاس مشتق شده فراخوانی نمیشه .
برای حل این مشکل شما باید پاید تابع Destructor کلاس پایه رو از نوع virtual تعریف کنید تا این اتفاق نیوفته .
که همین کار رو تو کد بالا انجام بدید میشه این کد .
#include <iostream>
using namespace std;
class Base
{
public :
Base() { cout<<"Base::Base()"<<endl; }
virtual ~Base() { cout<<"Base:~Base()"<<endl; }
};
class Derived : public Base
{
public:
Derived() { cout<<"Derived::Derived()"<<endl; }
~Derived() { cout<<"Derived::~Derived()"<<endl; }
};
int main ()
{
Base* obj = new Derived;
delete obj;
cin.get();
return 0;
}
نتیجه خروجی ها رو باهم مقایسه کنید متوجه میشید .
درباره توابع virtual و override کردن توابع تحقیق کن دلیل اصلیش رو متوجه میشی .