Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

सी ++ में वर्चुअल विनाशकों का उपयोग कब करें?


स्कॉट मेयर्स इन इफेक्टिव C++ कहते हैं -

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

तो आपको पॉलीमॉर्फिक बेस क्लास में डिस्ट्रक्टर्स को वर्चुअल घोषित करना चाहिए। ऐसा इसलिए है क्योंकि यदि आप एक व्युत्पन्न कंस्ट्रक्टर का उपयोग करके बेस क्लास का ऑब्जेक्ट बनाते हैं -

Base *b = new Derived();
// use b
delete b;

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



  1. स्मार्ट पॉइंटर क्या है और मुझे इसे C++ में कब इस्तेमाल करना चाहिए?

    एक स्मार्ट पॉइंटर एक ऐसा वर्ग है जो कच्चे (या नंगे) सी ++ पॉइंटर को लपेटता है। इसका उपयोग पॉइंटर द्वारा इंगित संसाधनों को प्रबंधित करने के लिए किया जाता है। उदाहरण के लिए, यदि उस स्मृति स्थान का संदर्भ खो जाता है। यह एक तरह से कचरा संग्रहकर्ता की तरह काम करता है। कई स्मार्ट पॉइंटर प्रकार हैं। आप

  1. मैं अग्रेषित घोषणा सी/सी++ का उपयोग कब कर सकता हूं?

    फॉरवर्ड डिक्लेरेशन से डिक्लेरेशन के बाद के कोड को पता चलता है कि Person नाम के साथ कुछ क्लासेज हैं। यह संकलक को संतुष्ट करता है जब वह इन नामों का उपयोग देखता है। बाद में लिंकर को कक्षाओं की परिभाषा मिल जाएगी। उदाहरण Class Person; void myFunc(Person p1) {    // ... } Class Person {  

  1. आपको C++ में 'मित्र' का प्रयोग कब करना चाहिए?

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