"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > एकाधिक वंशानुक्रम एक ही नाम लेकिन अलग-अलग हस्ताक्षर वाले अतिभारित कार्यों का समर्थन क्यों नहीं करता?

एकाधिक वंशानुक्रम एक ही नाम लेकिन अलग-अलग हस्ताक्षर वाले अतिभारित कार्यों का समर्थन क्यों नहीं करता?

2024-12-23 को प्रकाशित
ब्राउज़ करें:984

Why Doesn't Multiple Inheritance Support Overloaded Functions with the Same Name but Different Signatures?

एकाधिक वंशानुक्रम वाले ओवरलोडेड फ़ंक्शन

सी में, फ़ंक्शन ओवरलोडिंग एक ही नाम के साथ कई फ़ंक्शन को एक ही दायरे में परिभाषित करने की अनुमति देता है, बशर्ते उनके पास अलग-अलग पैरामीटर सूचियाँ हैं। हालाँकि, यह व्यवहार एक ही नाम के साथ कई-विरासत में मिले कार्यों तक नहीं, बल्कि अलग-अलग हस्ताक्षरों तक विस्तारित होता है। इससे सवाल उठता है: ऐसे कार्यों को अतिभारित क्यों नहीं माना जाता?

सी मानक की धारा 10.2/2 के अनुसार, सदस्य लुकअप नियम यह निर्देशित करते हैं कि नाम लुकअप के दौरान छिपी हुई घोषणाओं को विचार से हटा दिया जाता है। जब कई आधार वर्ग समान नाम लेकिन विभिन्न मापदंडों के साथ फ़ंक्शन को परिभाषित करते हैं, तो ये फ़ंक्शन एक-दूसरे से छिपे हो सकते हैं। इसलिए, यदि घोषणाओं का परिणामी सेट एक ही प्रकार के उप-वस्तुओं से नहीं है, या इसमें एक गैर-स्थैतिक सदस्य और विभिन्न उप-वस्तुओं के सदस्य शामिल हैं, तो एक अस्पष्टता उत्पन्न होती है और कार्यक्रम को गलत माना जाता है।

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

class A {
public:
  int f(int);
};

class B {
public:
   int f();
};

class C : public A, public B {};

इस मामले में, एफ अस्पष्ट है क्योंकि इसे दो अलग-अलग आधार वर्गों (ए और बी) में परिभाषित किया गया है। इसलिए, सी क्लास से एफ के लिए निम्नलिखित कॉल गलत है:

int main() {
  C c;
  c.f();  // ambiguous
}

इस अस्पष्टता को हल करने के लिए, आप यह निर्दिष्ट करने के लिए उपयोग घोषणा का उपयोग कर सकते हैं कि कौन सा बेस क्लास एफ फ़ंक्शन लागू करता है। उदाहरण के लिए:

class C : public A, public B {
     using A::f;
     using B::f;
};

इस संशोधन के साथ, c.f() अब स्पष्ट रूप से वर्ग A से f को कॉल करता है, जिससे अस्पष्टता का समाधान होता है।

इसके विपरीत, आपके द्वारा प्रदान किया गया दूसरा कोड उदाहरण काम करता है क्योंकि foo(float) परिभाषित है व्युत्पन्न वर्ग के दायरे में, और एकाधिक आधार वर्गों से विरासत में नहीं मिला है। इसलिए, d.foo(5) बिना किसी अस्पष्टता के सीधे foo(float) फ़ंक्शन को कॉल करता है।

नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3