2012-03-31 12 views
6

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

+0

'giveы': हैलो रूस :) – iehrlich

+2

संबंधित से: [संरक्षित विरासत] (http: // stackoverflow .com/प्रश्न/2090661/संरक्षित विरासत) – ipc

+2

सी ++ का हर भाग उपयोगी नहीं है। संरक्षित विरासत जैसी सुविधा को परिभाषित करना स्वाभाविक है, क्योंकि यह सामान्य योजना में अच्छी तरह से फिट बैठता है, लेकिन यह इसे व्यापक रूप से (या बिल्कुल) उपयोगी नहीं बनाता है। यहां तक ​​कि कुछ चीजें जिन्हें * स्पष्ट रूप से डिज़ाइन किया गया था, वे उपयोगी नहीं थे, जैसे 'वालर्रे', 'निर्यात', 'वेक्टर ' या अपवाद विनिर्देश। –

उत्तर

3

आधार-से-सदस्य मुहावरे को कभी-कभी संरक्षित विरासत की आवश्यकता होती है।

समस्या यह है कि पतों मुहावरा

निम्नलिखित है: आप कभी कभी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 में निर्माण किया है जरूरत है, और इस तरह ostreamfoo::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_basefoo से पहले का निर्माण किया है, और ostreamfoo::foo के लिए पारित मान्य है।

आप file चाहते हैं bar के एक संरक्षित सदस्य बनने के लिए, आप सुरक्षित विरासत का उपयोग करना चाहिए:

struct bar : protected bar_base, public foo { ... } 
2

protected का अर्थ है कि सदस्य चर सबक्लास से सुलभ होंगे लेकिन बाहर से नहीं।

एक बहुत ही सरल उदाहरण एक वर्ग हो सकता है जो एक चर का उपयोग करता है (x कहें) कुछ आंतरिक गणना करने के लिए। यदि एक उप-वर्ग को समान गणना करने की आवश्यकता होगी तो शायद x तक पहुंचने की आवश्यकता होगी। इसे निजी बनाना इसे एक्सेस करने के लिए सबक्लास से बच जाएगा, इसे सार्वजनिक बनाने से यह सबके लिए सुलभ हो जाएगा। संरक्षित एक व्यापार की तरह है।

+2

प्रश्न सुरक्षित विरासत के बारे में है, 'कक्षा ए: संरक्षित बी ', संरक्षित सदस्यों के बारे में नहीं। –

4

संरक्षित विरासत ऐसा कुछ है जिसका अर्थ मुझे इस दिन तक बढ़ाता है।

यह सुरक्षित विरासत पर स्कॉट मेयर्स राय (प्रभावी सी ++, तीसरा संस्करण) है :)।

हालांकि, यह पृष्ठ दिलचस्प है: Effective C++: discouraging protected inheritance?

0

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

+2

प्रश्न सुरक्षित विरासत के बारे में है, 'वर्ग ए: संरक्षित बी', संरक्षित सदस्यों के बारे में नहीं। –

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