2010-08-23 23 views
6
struct B1{ 
    int d; 
    void fb(){}; 
}; 

struct B2 : B1{ 
    using B1::d; 
    using B1::fb; 

    int d;    // why this gives error? 
    void fb(){}   // and this does not? 
}; 

int main(){} 

, क्योंकि B1::fb()B1::fb(B1*)and B2::fb()B2::fb(B2*) के रूप में इलाज के रूप में व्यवहार किया जाता है यह है? यही है, अंतर्निहित पैरामीटर, इन्हें अलग करने में मदद करता है?का उपयोग करते हुए घोषणा (व्युत्पन्न वर्ग)

$ 13.3.1/4-

एक का उपयोग कर-घोषणा से शुरू की एक व्युत्पन्न वर्ग, समारोह माना जाता है में के प्रयोजन के लिए व्युत्पन्न वर्ग का सदस्य होना nonconversion कार्यों के लिए अंतर्निहित ऑब्जेक्ट पैरामीटर के प्रकार को परिभाषित करना।

उत्तर

9

सी ++ मानक (सी ++ 03 §7.3.3/12) बताते हैं:

जब एक का उपयोग कर-घोषणा एक व्युत्पन्न वर्ग दायरे में एक आधार वर्ग से नाम लाता है, सदस्य कार्यों व्युत्पन्न कक्षा में एक ही नाम और पैरामीटर प्रकारों के साथ बेस वर्ग (विरोधाभासी के बजाए) सदस्य कार्यों को ओवरराइड करें और/या छुपाएं।

आपके उदाहरण में, B2::fb() घोषणा का उपयोग करके B1::fb() छुपाता है।

का सवाल है क्यों यह B2 की परिभाषा में दोनों using B1::d; और int d; के लिए बीमार बनाई है, सी ++ मानक (सी ++ 03 §7.3.3/10) बताते हैं:

एक के बाद से घोषणा-घोषणा एक घोषणा है, उसी घोषणात्मक क्षेत्र में उसी नाम की घोषणाओं पर प्रतिबंध भी घोषणाओं का उपयोग करके पर लागू होते हैं।

इसलिए, यह एक ही कारण के लिए बीमार का गठन होता है कि अगले बीमार का गठन है:

struct S { int d; int d; }; 
+0

और पूर्णांक घ: यह एक एकल कथात्मक क्षेत्र में ही नाम के दो वस्तुओं में जो परिणाम उपयोग से पिछली घोषणा के साथ संघर्ष ... – diverscuba23

+0

उस मामले में $ 13.3.1/4 का असली प्रभाव क्या है? – Chubsdad

+1

@chubsdad: चूंकि 'बी 2 :: एफबी()' छुपाएं बी 1 :: एफबी() ',' बी 1 :: एफबी() 'ओवरलोड रिज़ॉल्यूशन के दौरान उम्मीदवार फ़ंक्शन के रूप में नहीं माना जाता है, इसलिए §13.3.1/4 करता है आवेदन नहीं किया। –

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