2012-04-05 21 views
7

मेरे पास निम्न प्रश्न है;विरासत और मैत्री पहुंच। सी ++

classB inherits from classA 
classC is friend of classB 

क्या इसका मतलब क्लास क्लास के संरक्षित सदस्य तक पहुंचने में सक्षम होना चाहिए? चूंकि कक्षाबी को कक्षा ए से विरासत में मिला है, इसलिए कक्षा वर्ग कक्षा कक्षा में सबकुछ एक्सेस कर सकता है?

उत्तर

6

इसका मतलब है कि classCclassB की रक्षा की classA subobject भाग का उपयोग करने के लिए सक्षम होना चाहिए। यह classA से गैर-सार्वजनिक तक पहुंचने में सक्षम होना चाहिए।

उदाहरण के लिए:

class C; 

class A 
{ 
protected: 
    int i; 
}; 

class B: 
    public A 
{ 
    friend class C; 
}; 

class C 
{ 
public: 
    void foo(A& a, B& b) 
    { 
    // a.i = 3; // not allowed 
    b.i = 3; // allowed, accesses the `i` of the `A` subobject of `B` 
    } 
}; 
+0

यह मूल प्रश्न के लिए बेहतर उत्तर है। –

+0

@ केरेकस्क: धन्यवाद। – celtschk

8

[मेरा मूल उत्तर बकवास था। इसके लिए माफ़ी। उनका कहना है कि और बेहतर जवाब प्रदान करने के लिए @celtschk लिए धन्यवाद।]

हैं CB के एक दोस्त है, यह B के सदस्यों के सभी का उपयोग कर सकते हैं, चाहे निजी, सार्वजनिक, या संरक्षित है, और उस में शामिल हैं सुलभ (सार्वजनिक और सुरक्षित) सदस्यों को बताया कि एक आधार subobject का हिस्सा हैं:

struct A { protected: int a; }; 
struct B : A { private: int b; friend struct C; } 

struct C 
{ 
    B x; 
    A w; 

    void f() 
    { 
     x.a = 1; // fine 
     x.b = 2; // fine 

     // w.a = 0; /* Error, #1 */ 
    } 

    friend struct D; // see below 
}; 

हालांकि, दोस्ती न सकर्मक और न ही विरासत में मिला है: CB का एक दोस्त है, लेकिन A की नहीं (देखें # 1)। इसके अलावा, अगर DC के एक दोस्त है, तो D पहुँच कि C के किसी भी नहीं मिलता है के B को दोस्ती यह प्रदान करता है, तो DB तक नहीं पहुँच सकता है गैर सरकारी सदस्य हैं। इसी तरह, अगर C से struct E : C इनहेरिट करती है, तो E भी नहीं स्वचालित रूप से B के मित्र हैं:

struct D 
{ 
    B y; 
    void g() 
    { 
     // y.b = 3; /* Error! */ 
    } 
}; 

struct E : C 
{ 
    B z; 
    void h() 
    { 
     // y.b = 4; /* Error! */ 
    } 
} 

शायद एक संक्षेप में प्रस्तुत कर सकते हैं क्या कुछ बिंदुओं में चल रहा है:

  • एक व्युत्पन्न वर्ग पहुँच गया है प्रत्येक बेस क्लास के सभी सार्वजनिक और संरक्षित सदस्यों के लिए।

  • कक्षा के एक मित्र के पास उस वर्ग के सभी सदस्यों तक पहुंच है जो इसके लिए सुलभ हैं (यानी सभी सदस्य निजी आधार सदस्यों को छोड़कर)।

  • मित्रता विरासत में नहीं मिली है: यदि किसी वर्ग के मित्र हैं, तो वह दोस्ती इसके किसी भी बेस क्लास या न ही किसी भी व्युत्पन्न कक्षाओं पर लागू होती है।

  • एक दोस्त का दोस्त एक दोस्त नहीं है।

+0

यह भी 'b' के' A' subobject के संरक्षित सदस्यों पहुँच सकते हैं। यह सिर्फ मनमानी 'ए' वस्तुओं के संरक्षित सदस्यों तक नहीं पहुंच सकता है (लेकिन न ही 'बी')। – celtschk

+0

@celtschk: मुझे लगता है कि मेरा जवाब पूरी तरह से गलत है। मुझे इसे संशोधित करने की जरूरत है। –

+0

यह अभी भी पूरी तरह से सही नहीं है: यह निश्चित रूप से केवल 'ए' सबोबजेक्ट के उन सदस्यों तक पहुंच सकता है, जो 'बी' स्वयं ही पहुंच सकते हैं। जैसा लिखा है, उसे 'ए' के ​​निजी सदस्यों तक पहुंच भी होनी चाहिए। – celtschk

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