2013-11-28 12 views
10

सार्वजनिक विरासत आसान है।संरक्षित विरासत का व्यावहारिक उपयोग क्या है?

ए: सार्वजनिक बी का मतलब है कि प्रत्येक ए बी है। अधिकांश प्रोग्रामिंग भाषा में, जैसे vb.net और purpose-c, यह विरासत का एकमात्र प्रकार है। कि व्यर्थ है, क्योंकि इसका मतलब है कि एक बी बजाय शामिल करना चाहिए निजी बी का मतलब है A, B द्वारा कार्यान्वित किया जाता हालांकि,:

निजी विरासत भी आसान है, लेकिन व्यर्थ

एक है। स्वामित्व का मतलब कम नुकसान के साथ कम युग्मन है।

फिर हमने विरासत को सुरक्षित रखा है।

क्या कोई मुझे बता सकता है कि इसके लिए क्या है? कुछ कहते हैं कि यह "रिश्ते के रूप में" है। मैं अभी भी उस पर बहुत स्पष्ट नहीं हूं।

क्या किसी के पास कुछ नमूना मामले हैं जहां लोग वास्तविक उत्पादक उपयोग के लिए अच्छे पैटर्न (और विवेक) में संरक्षित विरासत का उपयोग करते हैं?

+0

मैं गलत हो सकता हूं, लेकिन मुझे लगता है कि मैंने _the_ सुनहरी सी ++ किताबों में से एक में पढ़ा है (जिसे वास्तव में याद नहीं है), कि 'संरक्षित' विरासत (लगभग?) बकवास है (लगभग?) कभी भी उपयोग नहीं किया जाता है। "भविष्य के उपयोग के लिए आरक्षित" की तरह। लेकिन, फिर से, मैं झूठ बोल सकता हूं :) –

+0

[यह उत्तर] (जोहान्स Schaub द्वारा http://stackoverflow.com/a/1374362/2513200) वास्तव में एक उपयोग केस मिला। यह अभी भी इसे "शायद ही उपयोगी" कहता है। – Hulk

+0

या कोशिश करें [यह एक] (http://stackoverflow.com/questions/374399/why-do-we-actually-need-private-or-protected-inheritance-in-c/374423#374423) – neutrino

उत्तर

10

निजी विरासत भी आसान है, लेकिन व्यर्थ

एक है। स्वामित्व का मतलब कम नुकसान के साथ कम युग्मन है।

कि आप निजी विरासत के कारणों को नहीं देख सकते हैं इसका मतलब यह नहीं है कि यह व्यर्थ है। ऐसे कई मामले हैं जहां निजी विरासत के कारण हैं। आप उसमें पहली नज़र में सही हैं, निजी विरासत का मतलब है-एक संबंध जैसे एकत्रीकरण, और निजी विरासत में थोड़ा (थोड़ा) कड़ा युग्मन होता है।

  • निजी वंशानुक्रम आप के रूप में अच्छी typedefs वारिस के साथ: aggretations से अधिक निजी विरासत का पक्ष लेने के लिए

    कारण निम्न में से कुछ हो सकता है। कुछ मामलों में (उदा। कक्षाएं) निजी तौर पर विरासत में विरासत केवल बेस क्लास में टाइप-टाईफ के पुनः टाइप किए गए हैं।

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

जेम्स 'टिप्पणी इन कारणों स्पष्ट रूप से तकनीकी कारणों से, कुछ भी कह सकते हैं "हैक" कर रहे हैं। हालांकि, ऐसे कारण मौजूद हैं, इसलिए निजी विरासत पूरी तरह से व्यर्थ नहीं है। यह सिर्फ "शुद्ध ओओ शैली" नहीं है - लेकिन सी ++ एक शुद्ध ओओ भाषा नहीं है।

संरक्षित विरासत के लिए कारण एक बार आप निजी वंशानुक्रम के लिए लोगों को समझ में आ काफी सरल हैं:

आप कारणों कुछ वारिस है, तो निजी तौर पर और उन लाभ बनाना चाहते (यानी जिसे भावी के सदस्य अपने कक्षा या टाइपपीफ) व्युत्पन्न कक्षाओं तक पहुंच योग्य, संरक्षित विरासत का उपयोग करें। जाहिर है, निजी विरासत का शायद ही कभी उपयोग किया जाना चाहिए, और संरक्षित विरासत को और भी अधिक।

+1

यह इंगित करने लायक है कि मूल विरासत, स्मॉलटाक कहते हैं, सी ++ में जनता की तुलना में निजी विरासत के करीब है। विरासत मूल रूप से साझा कार्यान्वयन, _not_ साझा इंटरफ़ेस का समर्थन करने के लिए डिज़ाइन की गई थी। –

+4

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

+4

उल्लेख नहीं है कि कभी-कभी, तथ्य यह है कि आप एक विशेष इंटरफेस को लागू करते हैं, यह आपके ग्राहकों के लिए एक कार्यान्वयन विवरण है। तथ्य यह है कि एक जीयूआई विजेट एक जीयूआई ईवेंट श्रोता है केवल विजेट को ही चिंतित करता है (और जहां यह घटनाओं के लिए enrols)। अतिरिक्त अंक के लिए –

4

संरक्षित विरासत के लिए मुख्य प्रेरणा ऑर्थोगोनैलिटी है। अन्य सभी संदर्भों में, आपके पास तीन अलग-अलग पहुंच नियंत्रण हैं: निजी, संरक्षित और सार्वजनिक। विरासत क्यों अलग होना चाहिए? अभ्यास में, कोई तर्क दे सकता है कि की आवश्यकता नहीं है या सामान्य रूप से सुरक्षित पहुंच के लिए उपयोग करें। यह मामले को अधिक से अधिक हो सकता है, लेकिन यह निश्चित है कि निजी या सार्वजनिक से बहुत कम सुरक्षित है।

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

+1

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

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