Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में इनहेरिटेंस और फ्रेंडशिप


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 का फ्रेंड नहीं है।
  • फ्रेंड फ़ंक्शन/क्लास केवल उस क्लास के प्राइवेट/प्रोटेक्टेड मेंबर्स एक्सेस कर सकते हैं जिसने उन्हें फ्रेंड घोषित किया है।
  1. C++ में मल्टीपल इनहेरिटेंस C++ में मल्टीपल इनहेरिटेंस

    मल्टीपल इनहेरिटेंस तब होता है जब कोई क्लास एक से अधिक बेस क्लास से इनहेरिट करती है। इसलिए क्लास मल्टीपल इनहेरिटेंस का उपयोग करके कई बेस क्लासेज से सुविधाएं इनहेरिट कर सकती है। यह C++ जैसी ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषाओं की एक महत्वपूर्ण विशेषता है। मल्टीपल इनहेरिटेंस को प्रदर्शित करने वाला एक

  1. - C++ में क्लासेस और ऑब्जेक्ट्स (Classes and Objects)

    क्लास क्या है? C++ की प्रमुख विशेषता जो OOPS अवधारणाओं का समर्थन करती है और उपयोगकर्ता-परिभाषित डेटा प्रकार है। क्लास ऑब्जेक्ट के लिए विनिर्देश (blueprint) प्रदान करती है और डेटा चर तथा डेटा मैनिपुलेट करने वाले फ़ंक्शंस को एक पैकेज में रखती है। क्लास परिभाषा class कीवर्ड से शुरू, फिर क्लास नाम, फि

  1. - C++ में फ्रेंड क्लास और फ़ंक्शन

    किसी क्लास का फ्रेंड फ़ंक्शन उस क्लास के स्कोप के बाहर परिभाषित होता है लेकिन उसे उस क्लास के सभी प्राइवेट और प्रोटेक्टेड मेंबर्स को एक्सेस करने का अधिकार होता है। भले ही फ्रेंड फ़ंक्शन के प्रोटोटाइप क्लास परिभाषा में दिखाई देते हैं, फ्रेंड मेंबर फ़ंक्शन नहीं होते। एक फ्रेंड एक फ़ंक्शन, फ़ंक्शन टेम