BCA / B.Tech 8 min read

Virtual Destructor in Hindi

Virtual Destructor in C++ in Hindi | C++ में वर्चुअल डेस्ट्रक्टर :


C++ में, वर्चुअल डेस्ट्रक्टर (Virtual Destructor) का उपयोग तब किया जाता है जब एक क्लास को एक बेस क्लास के रूप में डेराइव किया गया हो। 
वर्चुअल डेस्ट्रक्टर का मुख्य उद्देश्य यह सुनिश्चित करना है कि जब एक डेरिव्ड क्लास का ऑब्जेक्ट डिलीट किया जाता है, तो उसके सभी संसाधनों (resources) को सही तरीके से मुक्त (free) किया जाए।

C++ में वर्चुअल डेस्ट्रक्टर एक महत्वपूर्ण अवधारणा है, जो हमें यह सुनिश्चित करने में मदद करता है कि जब एक डेरिव्ड क्लास का ऑब्जेक्ट डिलीट होता है, तो उसके सभी संसाधनों को ठीक से मुक्त किया जाता है। 
इसे सही तरीके से उपयोग करने से हम मेमोरी लीक से बच सकते हैं और अपने प्रोग्राम के संसाधनों का बेहतर प्रबंधन कर सकते हैं। वर्चुअल डेस्ट्रक्टर का सही उपयोग करके, हम अपने प्रोग्राम को अधिक सुरक्षित और प्रभावी बना सकते हैं।


डेस्ट्रक्टर क्या होता है?

डेस्ट्रक्टर (Destructor) एक विशेष प्रकार का फंक्शन होता है जो ऑब्जेक्ट के जीवनकाल के अंत में स्वतः कॉल होता है। इसका उपयोग ऑब्जेक्ट द्वारा उपयोग किए जाने वाले संसाधनों को मुक्त करने के लिए किया जाता है।
डेस्ट्रक्टर का नाम क्लास के नाम के साथ ~ चिह्न के साथ लिखा जाता है, जैसे ~ClassName()।

वर्चुअल डेस्ट्रक्टर की आवश्यकता क्यों होती है?

  • जब हम बेस क्लास से डेराइव्ड क्लास बनाते हैं और डेरिव्ड क्लास का ऑब्जेक्ट बनाते हैं, तो हमें यह सुनिश्चित करना चाहिए कि डिलीट करते समय डेरिव्ड क्लास का डेस्ट्रक्टर सही तरीके से कॉल हो। अगर हम केवल बेस क्लास का डेस्ट्रक्टर उपयोग करते हैं
  •  और उसे वर्चुअल नहीं बनाते हैं, तो केवल बेस क्लास का डेस्ट्रक्टर कॉल होगा, और डेरिव्ड क्लास के डेस्ट्रक्टर को कॉल नहीं किया जाएगा। इससे मेमोरी लीक (memory leak) और अन्य समस्याएं हो सकती हैं।

वर्चुअल डेस्ट्रक्टर का उदाहरण :

उदाहरण कोड :

#include <iostream>
using namespace std;

class Base {
public:
    Base() {
        cout << "Base class constructor called." << endl;
    }

    virtual ~Base() {  // वर्चुअल डेस्ट्रक्टर
        cout << "Base class destructor called." << endl;
    }
};

class Derived : public Base {
public:
    Derived() {
        cout << "Derived class constructor called." << endl;
    }

    ~Derived() {
        cout << "Derived class destructor called." << endl;
    }
};

int main() {
    Base* b = new Derived();  // बेस क्लास पॉइंटर से डेरिव्ड क्लास का ऑब्जेक्ट बनाया गया
    delete b;  // डिलीट करते समय वर्चुअल डेस्ट्रक्टर काम करेगा
    return 0;
}
व्याख्या:

क्लास परिभाषा :

  • Base नामक एक बेस क्लास है जिसमें एक वर्चुअल डेस्ट्रक्टर है।
  • Derived नामक एक डेरिव्ड क्लास है जो Base क्लास से विरासत में मिला है और इसका अपना डेस्ट्रक्टर है।

ऑब्जेक्ट निर्माण:

  • Base* b = new Derived(); - यहां, हम एक बेस क्लास पॉइंटर का उपयोग करके डेरिव्ड क्लास का ऑब्जेक्ट बना रहे हैं। यह पॉइंटर Derived क्लास के ऑब्जेक्ट को पॉइंट करेगा।

डिलीट करना:

  • delete b; - जब हम इस पॉइंटर को डिलीट करते हैं, तो वर्चुअल डेस्ट्रक्टर के कारण, सबसे पहले डेरिव्ड क्लास का डेस्ट्रक्टर (~Derived) कॉल होता है, उसके बाद बेस क्लास का डेस्ट्रक्टर (~Base) कॉल होता है।

आउटपुट:

  • Base class constructor called.
  • Derived class constructor called.
  • Derived class destructor called.
  • Base class destructor called.

वर्चुअल डेस्ट्रक्टर के लाभ :

  • सुरक्षा: वर्चुअल डेस्ट्रक्टर का उपयोग करने से हम यह सुनिश्चित कर सकते हैं कि डेरिव्ड क्लास का डेस्ट्रक्टर हमेशा सही तरीके से कॉल होगा। इससे मेमोरी लीक और अन्य समस्याओं से बचा जा सकता है।
  • सही संसाधन प्रबंधन: यह सुनिश्चित करता है कि सभी संसाधनों को सही तरीके से मुक्त किया जा रहा है, जब किसी डेरिव्ड क्लास का ऑब्जेक्ट डिलीट किया जा रहा है।
  • पॉइंटर के माध्यम से वस्तुओं का प्रबंधन: यह ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग (OOP) की अवधारणा के अनुरूप है, जहां हम बेस क्लास के पॉइंटर्स के माध्यम से डेरिव्ड क्लास के ऑब्जेक्ट्स को प्रबंधित करते हैं।