[मेरा मूल उत्तर बकवास था। इसके लिए माफ़ी। उनका कहना है कि और बेहतर जवाब प्रदान करने के लिए @celtschk लिए धन्यवाद।]
हैं C
B
के एक दोस्त है, यह 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
};
हालांकि, दोस्ती न सकर्मक और न ही विरासत में मिला है: C
B
का एक दोस्त है, लेकिन A
की नहीं (देखें # 1)। इसके अलावा, अगर D
C
के एक दोस्त है, तो D
पहुँच कि C
के किसी भी नहीं मिलता है के B
को दोस्ती यह प्रदान करता है, तो D
B
तक नहीं पहुँच सकता है गैर सरकारी सदस्य हैं। इसी तरह, अगर 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! */
}
}
शायद एक संक्षेप में प्रस्तुत कर सकते हैं क्या कुछ बिंदुओं में चल रहा है:
एक व्युत्पन्न वर्ग पहुँच गया है प्रत्येक बेस क्लास के सभी सार्वजनिक और संरक्षित सदस्यों के लिए।
कक्षा के एक मित्र के पास उस वर्ग के सभी सदस्यों तक पहुंच है जो इसके लिए सुलभ हैं (यानी सभी सदस्य निजी आधार सदस्यों को छोड़कर)।
मित्रता विरासत में नहीं मिली है: यदि किसी वर्ग के मित्र हैं, तो वह दोस्ती इसके किसी भी बेस क्लास या न ही किसी भी व्युत्पन्न कक्षाओं पर लागू होती है।
एक दोस्त का दोस्त एक दोस्त नहीं है।
स्रोत
2012-04-05 20:40:37
यह मूल प्रश्न के लिए बेहतर उत्तर है। –
@ केरेकस्क: धन्यवाद। – celtschk