सी ++ में विध्वंसक अपने निर्माणों के क्रम में स्वचालित रूप से कॉल किया जाता है (व्युत्पन्न तब आधार) केवल तब होता है जब बेस क्लास विध्वंसक घोषित किया जाता है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
, अन्यथा यह अपरिभाषित व्यवहार का कारण बनता है।
संदर्भ: आभासी विध्वंसक