यह सार्वजनिक और निजी विरासत के बारे में स्पष्ट है, लेकिन संरक्षित के बारे में क्या है? कोई उदाहरण जब हमें वास्तव में इसका उपयोग करने की आवश्यकता होती है और इससे हमें लाभ मिलता है?किस मामले में हमें सुरक्षित विरासत की आवश्यकता है?
उत्तर
आधार-से-सदस्य मुहावरे को कभी-कभी संरक्षित विरासत की आवश्यकता होती है।
समस्या यह है कि पतों मुहावरानिम्नलिखित है: आप कभी कभीfoo
के बाद व्युत्पन्न वर्ग के एक सदस्य के साथ आधार वर्ग प्रारंभ करने, जैसे
struct foo
{
virtual ~foo() {}
protected:
foo(std::ostream& os)
{
os << "Hello !\n";
}
};
struct bar : foo
{
bar(const char* filename)
: foo(file), file(filename) // Bad, file is used uninitialized
{}
private:
std::fstream file;
};
लेकिन file
में निर्माण किया है जरूरत है, और इस तरह ostream
foo::foo
को पारित किया गया है अमान्य है।
आप एक सहायक वर्ग और निजी वंशानुक्रम के साथ इस का समाधान:
struct bar_base
{
std::fstream file;
protected:
bar_base(const char* filename)
: file(filename)
{}
~bar_base() {}
};
struct bar : private bar_base, public foo
{
bar(const char* filename)
: bar_base(filename), foo(file)
{}
};
अब bar_base
foo
से पहले का निर्माण किया है, और ostream
foo::foo
के लिए पारित मान्य है।
आप file
चाहते हैं bar
के एक संरक्षित सदस्य बनने के लिए, आप सुरक्षित विरासत का उपयोग करना चाहिए:
struct bar : protected bar_base, public foo { ... }
protected
का अर्थ है कि सदस्य चर सबक्लास से सुलभ होंगे लेकिन बाहर से नहीं।
एक बहुत ही सरल उदाहरण एक वर्ग हो सकता है जो एक चर का उपयोग करता है (x
कहें) कुछ आंतरिक गणना करने के लिए। यदि एक उप-वर्ग को समान गणना करने की आवश्यकता होगी तो शायद x
तक पहुंचने की आवश्यकता होगी। इसे निजी बनाना इसे एक्सेस करने के लिए सबक्लास से बच जाएगा, इसे सार्वजनिक बनाने से यह सबके लिए सुलभ हो जाएगा। संरक्षित एक व्यापार की तरह है।
प्रश्न सुरक्षित विरासत के बारे में है, 'कक्षा ए: संरक्षित बी ', संरक्षित सदस्यों के बारे में नहीं। –
संरक्षित विरासत ऐसा कुछ है जिसका अर्थ मुझे इस दिन तक बढ़ाता है।
यह सुरक्षित विरासत पर स्कॉट मेयर्स राय (प्रभावी सी ++, तीसरा संस्करण) है :)।
हालांकि, यह पृष्ठ दिलचस्प है: Effective C++: discouraging protected inheritance?।
संरक्षित विशेष रूप से अमूर्त सुपरक्लास के लिए उपयोगी है, जो बच्चों के ज्ञान के साथ लिखे गए हैं। संरक्षित सदस्य और विधियां बच्चों के लिए उपलब्ध हैं, और उस समय लागू किए जा रहे वर्गों के परिवार के बाहर दुनिया को उजागर किए बिना कोड प्रतिकृति को बचा सकते हैं।
प्रश्न सुरक्षित विरासत के बारे में है, 'वर्ग ए: संरक्षित बी', संरक्षित सदस्यों के बारे में नहीं। –
- 1. किस मामले में हमें <cassert> शामिल करना होगा?
- 2. क्या हमें टीसीएल में चर "अनसेट" करने की आवश्यकता है?
- 3. क्या ऐसे कोई उदाहरण हैं जहां हमें सी ++ में * संरक्षित विरासत की आवश्यकता है?
- 4. किस प्रकार की विरासत अधिक बेहतर है?
- 5. हमें जावा में इंटरफेस की आवश्यकता क्यों है?
- 6. node.js विरासत की आवश्यकता है?
- 7. हमें लक्ष्य नामस्थान की आवश्यकता क्यों है?
- 8. हमें "आउट" पैरामीटर की आवश्यकता क्यों है?
- 9. हमें "हटाएं []" ऑपरेटर की आवश्यकता क्यों है?
- 10. हमें फ़ील्ड टैग की आवश्यकता क्यों है?
- 11. हमें यहां टाइपनाम की आवश्यकता क्यों है?
- 12. हमें सी # प्रतिनिधियों की आवश्यकता क्यों है
- 13. हमें वेब-सॉकेट की आवश्यकता क्यों है?
- 14. हमें डिज़ाइन पैटर्न की आवश्यकता क्यों है
- 15. हमें संरचना की आवश्यकता क्यों है? (सी #)
- 16. हमें strdup() की आवश्यकता क्यों है?
- 17. क्या हमें इस परिदृश्य में हाइबरनेट मैपिंग की आवश्यकता है?
- 18. मुझे किस एसएसएल प्रमाणपत्र की आवश्यकता है?
- 19. हमें डेटाबेस टेबल्स में ऑडिट कॉलम की आवश्यकता क्यों है?
- 20. क्या हमें वास्तव में एक सुरक्षित रिलीज मैक्रो की आवश्यकता है?
- 21. हमें सजावटी डिजाइन पैटर्न में सजावट की आवश्यकता क्यों है?
- 22. हमें सी ++ में शुद्ध आभासी विनाशक की आवश्यकता क्यों है?
- 23. हमें RuntimeException में प्रयास करने की आवश्यकता क्यों नहीं है?
- 24. हमें गतिशील भाषाओं में इंटरफेस की आवश्यकता क्यों नहीं है?
- 25. राइनो मोक्स - क्या हमें वास्तव में स्टब्स की आवश्यकता है?
- 26. क्या हमें अंत में अर्धविराम की आवश्यकता है?
- 27. हमें हडोप स्टैक में ज़ूकीपर की आवश्यकता क्यों है?
- 28. जब हमें एक से अधिक EntityManager की आवश्यकता होती है?
- 29. इस मामले में वैश्विक कीवर्ड की आवश्यकता क्यों नहीं है?
- 30. हमें क्यों जारी रखने की विधि की आवश्यकता है?
'giveы': हैलो रूस :) – iehrlich
संबंधित से: [संरक्षित विरासत] (http: // stackoverflow .com/प्रश्न/2090661/संरक्षित विरासत) – ipc
सी ++ का हर भाग उपयोगी नहीं है। संरक्षित विरासत जैसी सुविधा को परिभाषित करना स्वाभाविक है, क्योंकि यह सामान्य योजना में अच्छी तरह से फिट बैठता है, लेकिन यह इसे व्यापक रूप से (या बिल्कुल) उपयोगी नहीं बनाता है। यहां तक कि कुछ चीजें जिन्हें * स्पष्ट रूप से डिज़ाइन किया गया था, वे उपयोगी नहीं थे, जैसे 'वालर्रे', 'निर्यात', 'वेक्टर' या अपवाद विनिर्देश। –