C++ में, फ्रेंडशिप इनहेरिट नहीं होती। इसका अर्थ है कि यदि किसी पैरेंट क्लास के कुछ फ्रेंड फ़ंक्शन्स हैं, तो चाइल्ड क्लास को वे फ्रेंड के रूप में नहीं मिलेंगे।
इस उदाहरण में त्रुटि उत्पन्न होगी क्योंकि display() फ़ंक्शन MyBaseClass का फ्रेंड है लेकिन MyDerivedClass का फ्रेंड नहीं है। display() MyBaseClass के प्राइवेट मेंबर को एक्सेस कर सकता है।
उदाहरण
#include <iostream>
using namespace std;
class MyBaseClass {
protected:
int x;
public:
MyBaseClass() { x = 20; }
friend void display();
};
class MyDerivedClass : public MyBaseClass {
private:
int y;
public:
MyDerivedClass() { x = 40; }
};
void display() {
MyDerivedClass derived;
cout << "बेस क्लास के प्राइवेट मेंबर का मान: " << derived.x << endl;
cout << "डेराइव्ड क्लास के प्राइवेट मेंबर का मान: " << derived.y << endl;
}
int main() {
display();
return 0;
}
आउटपुट
[Error] 'int MyDerivedClass::y' is private [Error] within this context
व्याख्या
display()केवलMyBaseClassका फ्रेंड है।- यह
MyBaseClassके प्रोटेक्टेड मेंबरxको एक्सेस कर सकता है (क्योंकि डेराइव्ड क्लास में यह प्रोटेक्टेड है)। - लेकिन यह
MyDerivedClassके प्राइवेट मेंबरyको एक्सेस नहीं कर सकता, क्योंकि फ्रेंडशिप इनहेरिट नहीं होती। MyDerivedClassकाyप्राइवेट है औरdisplay()इसका फ्रेंड नहीं है।
सही करने के विकल्प
विकल्प 1: display() को डेराइव्ड क्लास का फ्रेंड भी बनाएं
class MyDerivedClass : public MyBaseClass {
private:
int y;
public:
MyDerivedClass() { x = 40; }
friend void display(); // फ्रेंडशिप घोषित करें
};
विकल्प 2: y को प्रोटेक्टेड बनाएं
class MyDerivedClass : public MyBaseClass {
protected: // प्राइवेट के बजाय प्रोटेक्टेड
int y;
public:
MyDerivedClass() { x = 40; }
};
विकल्प 3: गेटर मेथड प्रदान करें
class MyDerivedClass : public MyBaseClass {
private:
int y;
public:
MyDerivedClass() { x = 40; y = 30; }
int getY() const { return y; }
};
void display() {
MyDerivedClass derived;
cout << "x: " << derived.x << endl;
cout << "y: " << derived.getY() << endl; // पब्लिक इंटरफेस के माध्यम से
}
मुख्य नियम
- फ्रेंडशिप इनहेरिट नहीं होती - डेराइव्ड क्लास को बेस के फ्रेंड्स ऑटोमैटिकली नहीं मिलते।
- फ्रेंडशिप पारस्परिक नहीं है - यदि A, B का फ्रेंड है, तो B ऑटोमैटिकली A का फ्रेंड नहीं है।
- फ्रेंडशिप ट्रांजिटिव नहीं है - A, B का फ्रेंड है और B, C का फ्रेंड है ⇒ A, C का फ्रेंड नहीं है।
- फ्रेंड फ़ंक्शन/क्लास केवल उस क्लास के प्राइवेट/प्रोटेक्टेड मेंबर्स एक्सेस कर सकते हैं जिसने उन्हें फ्रेंड घोषित किया है।