2011-09-10 16 views
27

क्या उप-वर्ग उत्तराधिकारी है, मुख्य वर्ग के मित्र संघ (मुख्य वर्ग 'और मुख्य वर्ग के साथ मित्रवत अन्य वर्ग)?सी ++ दोस्त विरासत?

या इसे अलग-अलग रखने के लिए, विरासत मित्र कीवर्ड पर कैसे लागू होती है?

विस्तार करने के लिए: और यदि नहीं, तो क्या दोस्ती का उत्तराधिकारी करने का कोई तरीका है?

मैं डिजाइन समस्या को पोस्ट करने के लिए जॉन के सुझाव का पालन किया है:
C++ class design questions

+3

यदि आपके डिज़ाइन को विरासत मैत्री की आवश्यकता है, तो यह एक अच्छा संकेत है कि आपके डिज़ाइन में बदलाव की आवश्यकता है। –

+0

इस सुविधा के लिए उपयोग केस क्या है? आप जो वास्तव में करना चाहते हैं उसके आधार पर, आपके सभी वर्गों को इतना अनुकूल बनाने के अलावा अन्य विकल्प हो सकते हैं –

+0

@ डेविड: मैं स्थिति का वर्णन करने वाले प्रश्न के लिंक को शामिल करूंगा। – SSight3

उत्तर

35

मैत्री सी में विरासत में मिला नहीं है ++।

मानक कहते हैं (आईएसओ/आईईसी 14882: 2003, खंड 11.4.8):

मैत्री विरासत में मिला है और न ही सकर्मक न कर रहा है।

+0

क्या इसे बनाने के लिए वैसे भी है, इसलिए यह वारिस करता है? – SSight3

+2

@ एसएसआईटी 3: नहीं, आपको पदानुक्रम मित्रों में सभी वर्गों को स्पष्ट रूप से (संभवतः एक स्रोत कोड प्रीप्रोसेसर की सहायता से) बनाना होगा। यदि आपके पास हल करने के लिए एक विशिष्ट समस्या है, तो इसके बारे में स्पष्ट रूप से पूछें। – Jon

+0

एक अच्छा सुझाव की तरह लगता है। – SSight3

2

जवाब बहुत सरल है: नहीं, उपवर्गों दोस्त संघों के वारिस नहीं है। एक मित्र केवल कक्षा के निजी सदस्यों तक पहुंच सकता है, जो कि एसोसिएशन घोषित किया जाता है, न कि माता-पिता और/या उस वर्ग के बच्चे। यद्यपि आप सुपरक्लास के संरक्षित सदस्य तक पहुंच सकते हैं, लेकिन मुझे इसके बारे में निश्चित नहीं है।

+2

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

+0

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

+0

@ नवाज: वास्तव में नहीं! [एक्सेस विनिर्देशक क्या हैं जिन्हें मैं निजी संरक्षित या सार्वजनिक के साथ प्राप्त कर सकता हूं] (http://stackoverflow.com/questions/5447498/what-are-access-specifiers-should-i-inherit-with-private- संरक्षित- या-ublic /% 5 डी) आपके लिए एक अच्छा पढ़ा जाना चाहिए। –

6

आप माता-पिता में (स्थैतिक) संरक्षित विधियां बना सकते हैं जो आपको इस तरह की चीजों को करने की अनुमति देंगे।

class MyFreind 
{ 
private: 
    int m_member; 
    friend class Father; 
}; 

class Father 
{ 
protected: 
    static int& getMyFreindMember(MyFreind& io_freind) { return io_freind.m_member; } 
}; 

class Son : public Father 
{ 
public: 
    void doSomething(MyFriend& io_freind) 
    { 
     int& friendMember = getMyFreindMember(io_freind); 
     // .... 
    } //() 
}; 

हालांकि यह कैप्सूलीकरण नजरअंदाज तो आप शायद अपने डिजाइन में एक दूसरे से अवलोकन करना चाहिए।

+0

यह अन्य लिंक किए गए प्रश्न पर भी लागू होता है। अच्छी प्रतिक्रिया। मैं सोच रहा हूं कि कामों में एक नया स्वरूप है। – SSight3

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