2013-02-17 18 views
9

में दादा दादी अधिभारित कार्य मुझे समझने की आवश्यकता है कि क्यों सी ++ बच्चे में दादा-भारित फ़ंक्शन घोषित किए जाने पर बच्चे में दादा-दाएं अधिभारित कार्यों तक पहुंचने की अनुमति नहीं देता है। निम्न उदाहरण पर विचार करें:बच्चे

class grandparent{ 
public: 
    void foo(); 
    void foo(int); 
    void test(); 
}; 

class parent : public grandparent{ 
public: 
    void foo(); 
}; 

class child : public parent{ 
public: 
    child(){ 
     //foo(1); //not accessible 
     test(); //accessible 
    } 
}; 

Grandparent में यहाँ, दो कार्यों foo() और foo (int) अतिभारित रहे हैं काम करता है। लेकिन foo (int) पहुंच योग्य नहीं है क्योंकि foo() को अभिभावक में घोषित किया गया है (इससे कोई फर्क नहीं पड़ता कि यह घोषित सार्वजनिक या निजी या संरक्षित है)। हालांकि, परीक्षण() सुलभ है, जो ओओपी के अनुसार सही है।

मुझे इस व्यवहार के कारण को जानने की आवश्यकता है।

उत्तर

10

कारण विधि छिपाने है।

जब आप व्युत्पन्न कक्षा में एक ही नाम के साथ एक विधि घोषित करते हैं, तो उस नाम के साथ बेस क्लास विधियां छिपी हुई हैं। पूर्ण हस्ताक्षर कोई फर्क नहीं पड़ता (यानी सीवी-क्वालीफायर या तर्क सूची)।

आप स्पष्ट रूप से कॉल की अनुमति देना चाहते हैं, तो आप parent अंदर

using grandparent::foo; 

उपयोग कर सकते हैं।

+0

क्या कोई कारण है कि यह व्यवहार एक अच्छी बात है? (यानी ** क्यों ** किस कारण से, * क्यों * इसके कारण के रूप में * –

+1

@ संजय मानोहर का एकमात्र उपयोग गलतियों को रोकने के लिए होगा - यानी सोच रहा है कि आप माता-पिता से एक विधि बुला रहे हैं और वास्तव में दादा से एक विधि बुला रहा है, क्योंकि आप एक पैरामीटर चूक गए। और आप 'उपयोग' निर्देश के साथ इसके चारों ओर जा सकते हैं। –

+0

@ संजय मानोहर http://stackoverflow.com/questions/4837399/c-rationale-behind-hiding-rule देखें –

1

जरा कल्पना कि एक पुस्तकालय इस वर्ग के होते हैं:

struct Base { 
}; 

अपने कोड में आप एक आधार वर्ग के रूप में उस वर्ग का उपयोग करें:

struct Derived : Base { 
    void f(int); 
}; 

और अब आप लिखें:

Derived d; 
d.f('a'); 

और अब आपको उस लाइब्रेरी का चमकदार नया संस्करण 2.0 मिलता है, और बेस क्लास थोड़ा बदल गया है:

struct Base { 
    void f(char); 
} 

यदि ओवरलोडिंग यहां लागू होती है, तो आपका कोड टूट जाएगा।

संबंधित मुद्दे