সি ++ এ বিক্ষোভকারীরা কেবল ভিত্তি শ্রেণীর ডেস্ট্রাক্টর ঘোষিত হলেই তাদের নির্মাণের ক্রমানুসারে স্বয়ংক্রিয়ভাবে ডাকা হয় (তত্কালীন ভিত্তি প্রাপ্ত হয়)virtual
।
যদি তা না হয় তবে অবজেক্ট মোছার সময় কেবলমাত্র বেস ক্লাসের ডেস্ট্রাক্টরকে ডাকা হবে।
উদাহরণ: ভার্চুয়াল বিনাশক ছাড়াই
#include <iostream>
using namespace std;
class Base{
public:
Base(){
cout << "Base Constructor \n";
}
~Base(){
cout << "Base Destructor \n";
}
};
class Derived: public Base{
public:
int *n;
Derived(){
cout << "Derived Constructor \n";
n = new int(10);
}
void display(){
cout<< "Value: "<< *n << endl;
}
~Derived(){
cout << "Derived Destructor \n";
}
};
int main() {
Base *obj = new Derived(); //Derived object with base pointer
delete(obj); //Deleting object
return 0;
}
আউটপুট
Base Constructor
Derived Constructor
Base Destructor
উদাহরণ: বেস ভার্চুয়াল ডেস্ট্রাক্টর সহ
#include <iostream>
using namespace std;
class Base{
public:
Base(){
cout << "Base Constructor \n";
}
//virtual destructor
virtual ~Base(){
cout << "Base Destructor \n";
}
};
class Derived: public Base{
public:
int *n;
Derived(){
cout << "Derived Constructor \n";
n = new int(10);
}
void display(){
cout<< "Value: "<< *n << endl;
}
~Derived(){
cout << "Derived Destructor \n";
delete(n); //deleting the memory used by pointer
}
};
int main() {
Base *obj = new Derived(); //Derived object with base pointer
delete(obj); //Deleting object
return 0;
}
আউটপুট
Base Constructor
Derived Constructor
Derived Destructor
Base Destructor
বেস শ্রেণীর ধ্বংসকারীকে virtual
অন্যথায় হিসাবে ঘোষণা করার পরামর্শ দেওয়া হয় , এটি অনির্ধারিত আচরণের কারণ হয়।
তথ্যসূত্র: ভার্চুয়াল ধ্বংসকারী