C++ वर्चुअल कंस्ट्रक्टर

C Varcu Ala Kanstraktara



C++ हमें वर्चुअल कंस्ट्रक्टर के निर्माण की सुविधा नहीं देता है क्योंकि क्लास के कंस्ट्रक्टर को ओवरराइड करना संभव नहीं है। तो, कंस्ट्रक्टर वर्चुअलाइजेशन अर्थहीन है। C++ प्रोग्राम में वर्चुअल कंस्ट्रक्टर बनाने की कोई अवधारणा नहीं है, लेकिन हम वहां वर्चुअल डिस्ट्रक्टर बना सकते हैं। हम इसे परिभाषित भी कर सकते हैं क्योंकि C++ में किसी कंस्ट्रक्टर की प्रोग्रामिंग को वर्चुअल नहीं माना जा सकता है क्योंकि जब किसी क्लास के कंस्ट्रक्टर को कॉल किया जाता है, तो मेमोरी में कोई वर्चुअल टेबल नहीं होती है जो इंगित करती है कि कोई वर्चुअल पॉइंटर नहीं बनाया गया है। इस प्रकार, कंस्ट्रक्टर को हर समय गैर-आभासी होना चाहिए।

हालाँकि, एक आभासी विध्वंसक मौजूद हो सकता है। यहां, हम दिखाएंगे कि जब हम C++ में वर्चुअल कंस्ट्रक्टर बनाते हैं तो क्या होता है और साथ ही वर्चुअल कंस्ट्रक्टर के बजाय वर्चुअल डिस्ट्रक्टर की कार्यप्रणाली क्या होती है।

उदाहरण 1:

आइए वर्चुअल कंस्ट्रक्टर बनाएं और 'iostream' हेडर फ़ाइल रखकर अपना कोड शुरू करें। यह हेडर फ़ाइल उन फ़ंक्शंस के लिए है जो इसमें घोषित हैं जैसे 'cin' और 'cout'। इसके बाद, हम 'std' नेमस्पेस जोड़ते हैं, इसलिए हम अपने कोड में प्रत्येक फ़ंक्शन के साथ इस 'std' को नहीं जोड़ सकते। इसके बाद, हम एक क्लास बनाते हैं जो 'my_base' नाम से हमारे कोड का बेस क्लास है और फिर वर्चुअल कंस्ट्रक्टर बनाने के लिए 'पब्लिक' जोड़ते हैं।







वर्चुअल कंस्ट्रक्टर यहां 'वर्चुअल' कीवर्ड डालकर बनाया गया है। इस वर्चुअल कंस्ट्रक्टर के अंदर, हम एक 'काउट' स्टेटमेंट डालते हैं। इसके नीचे, हम 'शो' नामक एक फ़ंक्शन बनाते हैं जिसमें हम फिर से 'काउट' का उपयोग करते हैं। इसके बाद, हम 'my_derived' नाम से इस बेस क्लास का एक व्युत्पन्न वर्ग बनाते हैं और फिर 'सार्वजनिक' फ़ील्ड में 'my_derived()' कंस्ट्रक्टर स्थापित करते हैं। हम इस 'my_derived()' कंस्ट्रक्टर में एक 'काउट' स्टेटमेंट डालते हैं। इसके नीचे, हम 'शो' नामक एक फ़ंक्शन बनाते हैं जहां हम एक बार फिर 'काउट' का उपयोग करते हैं।



अब, 'मेन()' को लागू करने के बाद, हम 'my_ptr' नाम के साथ बेस क्लास का एक पॉइंटर बनाते हैं और व्युत्पन्न क्लास का ऑब्जेक्ट भी बनाते हैं जो 'Obj_d' है। इसके बाद, हम 'Obj_d' का पता 'my_ptr' को निर्दिष्ट करते हैं। फिर, हम 'my_ptr' के माध्यम से 'शो()' फ़ंक्शन को कॉल करते हैं।



कोड 1:





#शामिल करें
का उपयोग करते हुए नाम स्थान कक्षा ;
कक्षा मेरा_आधार
{
जनता :
आभासी मेरा_आधार ( )
{
अदालत << 'यह मेरा बेस क्लास है' << अंतः ;
}
खालीपन दिखाओ ( )
{
अदालत << 'बेस क्लास का शो फ़ंक्शन' << अंतः ;
}
} ;
कक्षा मेरा_व्युत्पन्न : जनता मेरा_आधार
{
जनता :
मेरा_व्युत्पन्न ( )
{
अदालत << 'यहां मेरी व्युत्पन्न कक्षा है' << अंतः ;
}
खालीपन दिखाओ ( )
{
अदालत << 'व्युत्पन्न वर्ग का शो फ़ंक्शन' < दिखाओ ( ) ;
}

आउटपुट:
यहां, यह एक त्रुटि संदेश दिखाता है जो कहता है कि कंस्ट्रक्टर को C++ प्रोग्रामिंग में वर्चुअल घोषित नहीं किया जा सकता है। तो, हम देख सकते हैं कि C++ हमें वर्चुअल कंस्ट्रक्टर उत्पन्न करने की अनुमति नहीं देता है लेकिन हम वर्चुअल डिस्ट्रक्टर बना सकते हैं।



उदाहरण 2:

आइए पिछली समस्या को हल करें और इस कोड में वर्चुअल डिस्ट्रक्टर बनाएं। 'new_base' क्लास घोषित करने के बाद, हम 'सार्वजनिक' कंस्ट्रक्टर डालते हैं जिसमें हम 'new_base' के साथ 'वर्चुअल ~' जोड़कर वर्चुअल डिस्ट्रक्टर बनाते हैं। हम इस वर्चुअल डिस्ट्रक्टर में एक 'काउट' स्टेटमेंट डालते हैं। इसके नीचे, हम 'शो' नामक एक फ़ंक्शन बनाते हैं जो 'काउट' का उपयोग करता है। इसके बाद, हम एक व्युत्पन्न वर्ग बनाते हैं जो इस 'new_base' बेस क्लास का 'new_derived' है और 'सार्वजनिक' फ़ील्ड में 'new_derived()' विध्वंसक का निर्माण करता है। इस 'new_derived()' विध्वंसक में अब एक 'cout' कथन जोड़ा गया है।

इसके नीचे, हम 'शो' नामक एक फ़ंक्शन बनाते हैं जो फिर से 'काउट' कथन का उपयोग करता है। 'मुख्य()' फ़ंक्शन को कॉल करने के बाद, अब हम 'obj_d' व्युत्पन्न वर्ग का एक ऑब्जेक्ट और साथ ही 'ptr1' नामक बेस क्लास का एक पॉइंटर तैयार करते हैं। उसके बाद, हम 'ptr1' को 'obj_d' पता देते हैं। इसके बाद, 'शो()' विधि को 'ptr1' का उपयोग करके लागू किया जाता है।

कोड 2:

#शामिल करें
का उपयोग करते हुए नाम स्थान कक्षा ;
कक्षा new_base
{
जनता :
आभासी ~नया_आधार ( )
{
अदालत << 'बेस क्लास डिस्ट्रक्टर यहाँ है' << अंतः ;
}
खालीपन दिखाओ ( )
{
अदालत << 'बेस क्लास का शो फ़ंक्शन' << अंतः ;
}
} ;
कक्षा new_व्युत्पन्न : जनता new_base
{
जनता :
~नया_व्युत्पन्न ( )
{
अदालत << 'व्युत्पन्न वर्ग विध्वंसक यहाँ है' << अंतः ;
}
खालीपन दिखाओ ( )
{
अदालत << 'बेस क्लास का शो फ़ंक्शन' < दिखाओ ( ) ;
}

आउटपुट:
यह प्रोग्राम 'new_base' के एक पॉइंटर ऑब्जेक्ट का उपयोग करता है जो 'obj_d' व्युत्पन्न वर्ग को इंगित करता है। इस प्रकार, यह पहले 'new_base' वर्ग की 'शो()' विधि को कॉल करता है। फिर, यह 'new_derived' वर्ग की '~new_derived()' विधि को कॉल करता है और बेस क्लास के '~new_base' को प्रदर्शित करता है।

उदाहरण 3:

'वर्चुअल' कंस्ट्रक्टर उत्पन्न करने के लिए यहां एक और कोड है। 'आईओस्ट्रीम' और 'एसटीडी' नेमस्पेस को शामिल करने के बाद, हम एक क्लास 'बी' उत्पन्न करते हैं। इसके नीचे, हम 'सार्वजनिक' कंस्ट्रक्टर बनाते हैं जो 'बी()' है और फिर 'काउट' उत्पन्न करते हैं। कंस्ट्रक्टर और डिस्ट्रक्टर फ़ंक्शंस को 'सार्वजनिक' एक्सेस विनिर्देशक का उपयोग करके परिभाषित किया जाता है जिसमें क्लास में कोई भी ऑब्जेक्ट कॉल कर सकता है।

अब, हम इस बेस क्लास का '~बी()' डिस्ट्रक्टर भी बनाते हैं जिसमें हम फिर से 'काउट' का उपयोग करते हैं। फिर, हम 'डी' वर्ग बनाते हैं जो 'बी' बेस क्लास का व्युत्पन्न वर्ग है और यहां 'पब्लिक' को रखते हैं। इस 'पब्लिक' के अंदर, हम क्रमशः 'D()' और '~D' नाम से व्युत्पन्न वर्ग के कंस्ट्रक्टर और डिस्ट्रक्टर का निर्माण करते हैं। दोनों के अंदर 'काउट' समाहित है। अब, हमारे पास 'मुख्य()' फ़ंक्शन है। इस फ़ंक्शन को कॉल करने के बाद, हम बेस क्लास का पॉइंटर ऑब्जेक्ट जेनरेट करते हैं।

फिर, हम 'डिलीट' कीवर्ड का उपयोग करते हैं और यहां 'बेस_पीटीआर' डालते हैं। इस स्थिति में, बेस क्लास के पॉइंटर ऑब्जेक्ट को कॉल करके डिस्ट्रक्टर का स्थान हटा दिया जाता है।

कोड 3:

#शामिल
का उपयोग करते हुए नाम स्थान कक्षा ;
कक्षा बी
{
जनता :
बी ( )
{
अदालत << 'बेस क्लास का कंस्ट्रक्टर' << अंतः ;
}
~बी ( )
{
अदालत << 'बेस क्लास का विध्वंसक' << अंतः ;
}
} ;

कक्षा डी : जनता बी
{
जनता :
डी ( )
{
अदालत << 'व्युत्पन्न वर्ग का निर्माता' << अंतः ;
}
~डी ( )
{
अदालत << 'व्युत्पन्न वर्ग का विनाशक' << अंतः ;
}
} ;
int यहाँ मुख्य ( )
{
बी * आधार_पीटीआर = नया डी ;
मिटाना आधार_पीटीआर ;
}

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

निष्कर्ष

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