लेखन कोड के साथ this query के लिए उत्तर खोजने के दौरान, मुझे पता चला कि निजी/संरक्षित विरासत विभिन्न वर्गों से अपवाद प्राप्त करने के तरीके को बदलता है, जो बहुत ही आश्चर्यजनक था। उत्तर खोजने के लिए मैंने पहले मंच प्रश्नों का उल्लेख किया था और मैं this similar question पर आया था।विरासत अपवाद प्रबंधन को प्रभावित क्यों करती है?
मेरे लिए protected
virtual
विधियों के साथ बेस क्लास के लिए विरासत का उपयोग करना काफी स्पष्ट है। मानक को अलग रखते हुए, मैं जानना चाहता था क्यों सी ++ अपवाद हैंडलिंग विरासत विधि कॉल पर विरासत द्वारा प्रतिबंधित है? निम्नलिखित स्निपेट यह बताते हैं:
struct Base { virtual void printError() = 0; };
class Derived : protected Base { void printError() { } };
int main()
{
try {
throw new Derived;
}
catch(Base *p) { p->printError(); } // Ideal; but not invoked
catch(void *p) { ((Base*)p)->printError(); } // Ugly; but only way to invoke
}
संपादित करें: अगर हम एक जवाब के रूप में गोपनीयता संबंध पर विचार करें; स्वीकार किए जाते हैं। लेकिन फिर यह केवल catch()
बेस पॉइंटर्स प्राप्त करने के लिए क्यों लागू है, जबकि यह बेस पॉइंटर्स प्राप्त करने वाले कार्यों के लिए लागू नहीं है?
+1 अच्छा सवाल है। – Nawaz
मामूली नोट, आपको 'थ्रो' कथन में 'नया' उपयोग करने की आवश्यकता नहीं है, आप केवल ऐसा करके मेमोरी लीक पेश करने का जोखिम उठाते हैं। इसके बजाय 'फेंक दिया गया(); 'और संदर्भ' आधार 'के आधार पर पकड़ें। साथ ही, यह निश्चित रूप से मेरे लिए स्पष्ट नहीं है कि क्यों बेस क्लास वर्चुअल विधियों के लिए 'संरक्षित' विरासत का उपयोग करेगा, मुझे लगता है कि आपको यहां कुछ गड़बड़ है ... और अंत में, अपवाद वर्ग को आम तौर पर 'std :: अपवाद' से प्राप्त होना चाहिए और ओवरलोड 'char const * क्या() const'। –
@Matthieu, धन्यवाद, लेकिन उपरोक्त कोड सिर्फ डेमो उद्देश्य के लिए था। इस मामले में संदर्भ द्वारा पकड़ना संभव नहीं है क्योंकि आप 'शून्य 'नहीं पकड़ सकते हैं; हालांकि मैं संदर्भों को पकड़ना पसंद करता हूं। मेरे डिजाइन के आधार पर, मैं चाहता हूं कि इंटरफ़ेस (यहां 'बेस') कक्षा विधियों (विशेष रूप से वर्चुअल) को अपने किसी भी बच्चे द्वारा अन्य नामस्थानों में नहीं बुलाया जाना चाहिए। – iammilind