2010-01-26 18 views
7

यदि कक्षा क्लास से निजी रूप से विरासत में लिया गया वर्ग है और व्युत्पन्न वर्ग में मित्र मित्र f() है, तो कौन से सदस्य व्युत्पन्न वर्ग और बेस क्लास से f() तक पहुंच सकते हैं।निजी विरासत के साथ व्युत्पन्न वर्ग में मित्र समारोह

class Base { 
public: 
    int a; 
protected: 
    int b; 
private: 
    int c; 
}; 


class Derived: private Base {  
    void friend f() {} 

public: 
    int d; 
protected: 
    int e; 
private: 
    int f; 
}; 

मैं समझता हूँ कि अगर एक वर्ग आधार वर्ग से निजी तौर पर विरासत में मिला है, सब कुछ व्युत्पन्न वर्ग में निजी है।

लेकिन ऊपर दिए गए कोड में, फ़ंक्शन f() ए, बी, डी, ई, एफ तक पहुंच सकता है लेकिन सी नहीं?

उत्तर

9

'मैत्री' उस वर्ग तक पहुंच प्रदान करता है जो मित्र घोषित करता है - यह संक्रमणीय नहीं है। एक बुरा सादृश्य का उपयोग करने के लिए - मेरे दोस्त जरूरी नहीं कि मेरे पिताजी के दोस्त हों।

+5

समानता के लिए +1। –

+1

इस मामले में समानता इस बात के करीब होगी: 'मेरे घर में मेरे दोस्तों तक पहुंच प्रदान करने से उन्हें मेरे पिता की सुरक्षा तक पहुंच नहीं मिलेगी कि मैं खुद को नहीं खोल सकता' –

+0

@ ड्रिबीस: हाँ - आपका सादृश्य सी ++ व्यवहार के करीब है। –

2

निजी सदस्य व्युत्पन्न कक्षाओं में उपलब्ध नहीं हैं।

6

Derived एक दोस्त का उपयोग कर सकते कि वास्तव में क्या Derived ही कर सकते हैं - कि,Derived के किसी भी सदस्य, और किसी भी आधार वर्ग के किसी भी सार्वजनिक या संरक्षित सदस्य, या किसी भी सार्वजनिक या संरक्षित भव्य माता पिता के वर्ग की है, लेकिन नहीं है बेस क्लास के किसी भी निजी सदस्य, या निजी ग्रैंड-पैरेंट क्लास के सदस्य।

2

दोस्त समारोह के सभी सदस्यों व्युत्पन्न की पहुंच है:

सी ++ पूछे जाने वाले प्रश्न थोड़ा और अधिक विस्तार किया है। इसके पास बेस के किसी भी सदस्य तक पहुंच नहीं है जो व्युत्पन्न एक्सेस नहीं कर सकता है। व्युत्पन्न बेस :: सी तक नहीं पहुंच सकता है क्योंकि बेस :: सी निजी है।

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