2010-07-14 14 views
24

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

+4

आपको निजी विनाशक के साथ कक्षा से प्राप्त कुछ समस्याएं हो सकती हैं =) – SadSido

+0

http://stackoverflow.com/questions/631783/what-is-the-use-of-having-destructor-as-private के लिए डुप्लिकेट ? – SadSido

+1

इसी तरह का सवाल यहां: http://stackoverflow.com/questions/224966/private-and- संरक्षित-members-c – Jordan

उत्तर

12

से here:

लिया तो निर्माता/नाशक के रूप में निजी, तो वर्ग instantiated नहीं किया जा सकता है घोषित किया जाता है।

यह सच है, हालांकि इसे कक्षा में किसी अन्य विधि से तुरंत चालू किया जा सकता है। इसी प्रकार, यदि विनाशक private है, तो ऑब्जेक्ट केवल कक्षा के अंदर से ही हटाया जा सकता है। साथ ही, यह वर्ग को विरासत में रखने से रोकता है (या कम से कम, विरासत वर्ग को तत्काल/नष्ट होने से रोकें)।

+4

सार्वजनिक वर्ग ए {निजी ए() {} सार्वजनिक ए getA() {वापसी नया ए(); }} बिल्कुल सही नहीं है। –

+2

यह सच नहीं है। निजी विनाशक के साथ वस्तु * * तत्काल हो सकता है, (उदाहरण के लिए, एक दोस्त समारोह के अंदर एक ढेर पर)। – SadSido

+2

राइट आवंटित नहीं किया जा सकता है लेकिन आवंटित ढेर और मित्र कार्यों से भी ... –

22

यदि बेस क्लास विनाशक private या protected है तो आप बेस-क्लास पॉइंटर के माध्यम से delete पर कॉल नहीं कर सकते हैं।

बेस-क्लास पॉइंटर के माध्यम से व्युत्पन्न ऑब्जेक्ट के विनाश को रोकने के लिए संरक्षित विनाशक का उपयोग करें। यह व्युत्पन्न कक्षाओं के विनाशक तक पहुंच सीमित करता है। और यह कक्षा बेस के स्वचालित (ढेर) वस्तुओं को रोकता है।

अपने आपमें यह प्रयोग किया जाता है किसी भी अन्य बहुरूपी व्युत्पन्न वर्गों के संकेत के माध्यम से आधार के लिए उपयोग करने की अनुमति के लिए, लेकिन नहीं उपयोगकर्ताओं इस तरह के एक सूचक का उपयोग कर नष्ट करने के लिए अनुमति देते हैं। उदाहरण: - सार बेस कक्षाएं/इंटरफेस।

लेकिन एक protected, non-virtual नाशक एक बग होने की प्रतीक्षा में हो रहा है। मान लें कि आप destroy() फ़ंक्शन प्रदान नहीं करते हैं, आपको अंततः डाटर सार्वजनिक करना होगा। जैसे ही आप ऐसा करते हैं, क्लास पर आपका कोई और नियंत्रण नहीं होता है, और यदि कोई आपकी कक्षा से आगे निकलता है, तो गैर-वर्चुअल डॉटर के साथ पॉलिमॉर्फिक विलोपन का जोखिम चलाता है।

6

कोड का निम्न भाग संकलक त्रुटि (VC2010) में परिणाम होगा: C2248: 'आधार :: ~ आधार': निजी सदस्य वर्ग 'आधार' में घोषित

class base 
{ 
    ~base(){} 
}; 

class derived : public base 
{ 
}; 

int main() 
{ 
    derived* d = new derived; 

    delete d; 
} 

हालांकि उपयोग नहीं कर सकते, अगर आप आधार विनाशक को संरक्षित करने के लिए बदलते हैं, सब कुछ ठीक काम करता है।

+0

लेकिन यदि आपने इसे 'संरक्षित' में बदल दिया है, तो भी आप बेस क्लास पॉइंटर के माध्यम से वस्तुओं को नष्ट नहीं कर सके। (उस स्थिति में यह 'आभासी', बीटीडब्लू भी होना चाहिए।) जो कुछ हद तक व्युत्पन्न के कई उद्देश्यों को हरा देता है ... – sbi

6

उत्तर यह है कि आपकी धारणा गलत है। बेस क्लास विनाशक को निजी नहीं होने पर बुलाया जा सकता है।

+0

तो मेरी कक्षा कैसे नष्ट हो जाती है? – doron

+0

@ deus-ex-machina399: यह नहीं कर सकता। इसलिए आप इससे प्राप्त नहीं कर सकते हैं। और आप इसके स्वचालित ऑब्जेक्ट्स नहीं बना सकते हैं। और गतिशील वस्तुओं को कभी भी हटाया नहीं जा सकता है (जब तक कि आप एक सदस्य फ़ंक्शन प्रदान न करें जो ऐसा करता है)। – sbi

संबंधित मुद्दे