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

C++ में बेस क्लास के सभी ओवरलोडेड मेथड्स को छिपाना (Hiding)


C++ में, हम फ़ंक्शन ओवरलोडिंग तकनीकों का उपयोग कर सकते हैं। लेकिन यदि किसी बेस क्लास में एक मेथड ओवरलोडेड रूप में है (समान नाम लेकिन अलग फ़ंक्शन सिग्नेचर), और डेराइव्ड क्लास उस फ़ंक्शन को पुनः परिभाषित करती है जो बेस में मौजूद है, तो उस फ़ंक्शन के सभी ओवरलोडेड संस्करण डेराइव्ड क्लास से छिप जाएंगे।

आइए एक उदाहरण देखें ताकि स्पष्ट विचार मिल सके।

उदाहरण

#include <iostream>
using namespace std;

class MyBaseClass {
public:
    void my_function() {
        cout << "यह my_function है। यह कोई आर्गुमेंट नहीं लेता" << endl;
    }
    void my_function(int x) {
        cout << "यह my_function है। यह एक आर्गुमेंट x लेता है" << endl;
    }
};

class MyDerivedClass : public MyBaseClass {
public:
    void my_function() { // केवल पैरामीटर-रहित संस्करण ओवरराइड करता है
        cout << "यह my_function है। डेराइव्ड क्लास से, यह कोई आर्गुमेंट नहीं लेता" << endl;
    }
};

int main() {
    MyDerivedClass ob;
    ob.my_function(10); // त्रुटि! int संस्करण छिपा हुआ है
    return 0;
}

आउटपुट

[Error] 'MyDerivedClass::my_function(int)' से मेल खाने वाला कोई फ़ंक्शन नहीं
[Note] उम्मीदवार है: void MyDerivedClass::my_function()
[Note] उम्मीदवार 0 आर्गुमेंट्स की अपेक्षा करता है, 1 प्रदान किया गया

व्याख्या

जब डेराइव्ड क्लास किसी नाम के साथ फ़ंक्शन घोषित करती है, तो यह बेस क्लास में उसी नाम के सभी ओवरलोड्स को छिपा देती है (नाम छिपाना / name hiding)। यह C++ का नियम है ताकि अचानक ओवरलोड रिज़ॉल्यूशन परिवर्तनों से बचा जा सके।

समाधान: using डिक्लेरेशन

बेस क्लास के ओवरलोड्स को डेराइव्ड क्लास में दृश्यमान बनाने के लिए using डिक्लेरेशन का उपयोग करें:

class MyDerivedClass : public MyBaseClass {
public:
    using MyBaseClass::my_function; // बेस के सभी ओवरलोड्स लाएं
    
    void my_function() { // ओवरराइड
        cout << "डेराइव्ड: कोई आर्गुमेंट नहीं" << endl;
    }
};

int main() {
    MyDerivedClass ob;
    ob.my_function();    // डेराइव्ड संस्करण
    ob.my_function(10);  // बेस संस्करण (using के कारण दृश्यमान)
    return 0;
}

आउटपुट

डेराइव्ड: कोई आर्गुमेंट नहीं
यह my_function है। यह एक आर्गुमेंट x लेता है

मुख्य बिंदु

  • नाम छिपाना (name hiding) C++ में डिफ़ॉल्ट व्यवहार है।
  • using Base::func; बेस क्लास के सभी ओवरलोड्स को डेराइव्ड स्कोप में लाता है।
  • यह केवल नॉन-वर्चुअल फ़ंक्शन्स पर लागू होता है। वर्चुअल फ़ंक्शन्स ओवरराइड होते हैं, छिपते नहीं।
  • यदि आप ओवरराइड करना चाहते हैं, तो सभी ओवरलोड्स को ओवरराइड करें या using का उपयोग करें।
  1. - C++ में बेस और डेराइव्ड क्लास एक्सेप्शन पकड़ना

    बेस और डेराइव्ड दोनों क्लास के एक्सेप्शन को पकड़ने के लिए, डेराइव्ड क्लास के कैच ब्लॉक को बेस क्लास से पहले रखना आवश्यक है। अन्यथा, डेराइव्ड क्लास का कैच ब्लॉक कभी नहीं पहुंचेगा। एल्गोरिदम शुरुआत क्लास B घोषित करें क्लास D घोषित करें जो क्लास B को इनहेरिट करती है क्लास D का ऑब्जेक्ट घोष

  1. - C++ में पेरेंट क्लास से क्या-क्या इनहेरिट होता है?

    ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में, हम पेरेंट क्लास की विशेषताओं को इनहेरिट कर सकते हैं। पेरेंट क्लास को बेस क्लास के रूप में जाना जाता है जबकि चाइल्ड क्लास को डेराइव्ड क्लास के रूप में जाना जाता है। डेराइव्ड क्लास बेस क्लास के डेटा मेंबर्स, मेंबर फंक्शन्स को इनहेरिट कर सकती है। यदि डेटा मेंबर्स पब्

  1. - C++ में लोकल क्लास (Local Class)

    लोकल क्लास क्या है? एक फ़ंक्शन के अंदर घोषित क्लास को लोकल क्लास कहते हैं क्योंकि यह उस फ़ंक्शन के लिए स्थानीय (local) होती है। बेसिक उदाहरण #include <iostream> using namespace std; void func() { class LocalClass { }; } int main() { return 0; } नियम और प्रतिबंध लोकल क्लास का नाम