c++ - समान नाम के साथ समारोह लेकिन व्युत्पन्न वर्ग में अलग हस्ताक्षर




function inheritance (2)

ऐसा इसलिए है क्योंकि नाम लुकअप बंद हो जाता है अगर उसे आपके किसी एक आधार में नाम मिलता है। यह अन्य अड्डों में आगे नहीं देखेगा। बी में फ़ंक्शन ए में फ़ंक्शन को छाया करता है। आपको बी के दायरे में ए के फ़ंक्शन को फिर से घोषित करना होगा, ताकि दोनों कार्य बी और सी के भीतर से दिखाई दे सकें:

class A
{
    public:
    void foo(string s){};
};

class B : public A
{
    public:
    int foo(int i){};
    using A::foo;
};

class C : public B
{
    public:
    void bar()
    {
        string s;
        foo(s);
    }
};

संपादित करें: मानक देता है वास्तविक विवरण (10.2 / 2 से):

निम्नलिखित चरण कक्षा के दायरे में नाम लुकअप के परिणाम को परिभाषित करते हैं, सी। सबसे पहले, कक्षा में नाम के लिए प्रत्येक घोषणा और इसके प्रत्येक वर्ग वर्ग उप-वस्तुओं में से प्रत्येक में माना जाता है। एक उप-ऑब्जेक्ट बी में एक सदस्य का नाम एफ उप-ऑब्जेक्ट ए में सदस्य नाम f को छुपाता है यदि ए बी का बेस क्लास उप-ऑब्जेक्ट है तो कोई भी घोषणा जो छिपी हुई है, को विचार से हटा दिया गया है। इन घोषणाओं में से प्रत्येक घोषणा जिसे एक घोषणा-घोषणा द्वारा पेश किया गया था, को सी के प्रत्येक उप-ऑब्जेक्ट से माना जाता है, जिसमें उपयोग-घोषणा 9 6 द्वारा निर्दिष्ट घोषित घोषणा शामिल है) यदि घोषणा के परिणामस्वरूप सेट नहीं हैं सभी एक ही प्रकार की उप-वस्तुओं से, या सेट में एक गैर-सदस्यीय सदस्य होता है और इसमें विशिष्ट उप-वस्तुओं के सदस्य शामिल होते हैं, वहां एक अस्पष्टता होती है और कार्यक्रम खराब हो जाता है। अन्यथा यह सेट लुकअप का परिणाम है।

यह किसी अन्य स्थान पर कहने के लिए निम्नलिखित है (बस इसके ऊपर):

एक आईडी-अभिव्यक्ति [ कुछ "foo" ] के लिए, नाम लुकअप इस के दायरे में शुरू होता है; एक योग्य आईडी के लिए [ "ए :: फू" जैसे कुछ, ए एक नेस्टेड-नाम-विनिर्देशक है ], नाम लुकअप नेस्टेड-नाम-विनिर्देशक के दायरे में शुरू होता है। नाम लुकअप एक्सेस नियंत्रण से पहले होता है (3.4, खंड 11)।

([...] मेरे द्वारा रखे गए)। ध्यान दें कि इसका मतलब है कि यदि बी में आपका फू निजी है, तो ए में फू अभी भी नहीं मिलेगा (क्योंकि अभिगम नियंत्रण बाद में होता है)।

मेरे पास एक ही नाम के साथ एक कार्य है, लेकिन आधार और व्युत्पन्न कक्षाओं में विभिन्न हस्ताक्षर के साथ। जब मैं किसी अन्य वर्ग में बेस क्लास के फ़ंक्शन का उपयोग करने का प्रयास कर रहा हूं जो व्युत्पन्न से प्राप्त होता है, तो मुझे एक त्रुटि प्राप्त होती है। निम्नलिखित कोड देखें:

class A
{
    public:
    void foo(string s){};
};

class B : public A
{
    public:
    int foo(int i){};
};

class C : public B
{
    public:
    void bar()
    {
        string s;
        foo(s);
    }
};

मुझे जीसीसी कंपाइलर से निम्न त्रुटि प्राप्त होती है:

In member function `void C::bar()': no matching function for call to `C::foo(std::string&)' candidates are: int B::foo(int)

अगर मैं int foo(int i){}; हटा देता हूं int foo(int i){}; कक्षा B , या अगर मैं इसे foo1 से foo1 , तो सब कुछ ठीक काम करता है।

इसके साथ क्या समस्या है?


व्युत्पन्न कक्षाओं में कार्य जो आधार वर्गों में कार्यों को ओवरराइड नहीं करते हैं, लेकिन जिनके पास समान नाम है, वे बेस क्लास में उसी नाम के अन्य कार्यों को छुपाएंगे।

इसे आम तौर पर व्युत्पन्न कक्षाओं में कार्य करने के लिए बुरी आदत माना जाता है, जिसमें बास वर्ग में फ़ंक्शंस के समान नाम होता है, जो कि बेस क्लास फ़ंक्शंस को ओवरराइड करने का इरादा नहीं है, जो आप देख रहे हैं आमतौर पर वांछनीय व्यवहार नहीं है। आमतौर पर विभिन्न कार्यों को अलग-अलग नाम देने के लिए बेहतर होता है।

यदि आपको बेस फ़ंक्शन को कॉल करने की आवश्यकता है तो आपको A::foo(s) का उपयोग करके कॉल को दायरे में A::foo(s) । ध्यान दें कि यह A::foo(string) ही समय में A::foo(string) लिए किसी वर्चुअल फ़ंक्शन तंत्र को अक्षम भी करेगा।





c++-faq