2011-01-05 13 views
6

तक पहुंच घोषणा, यह देखते हुए कि हमने बेस क्लास में अधिभारित विधियां हैं, और एक व्युत्पन्न कक्षा जिसे निजी/संरक्षित के रूप में विरासत में मिला है।बेस क्लास अधिभारित विधि

  1. क्या हम अधिभारित तरीकों के केवल एक/कई मूल पहुंच स्तर को पुनर्स्थापित कर सकते हैं?
  2. जीसीसी 4.4.0 पर मैं बेस विधियों को सुरक्षित पहुंच के तहत रखने की कोशिश करता हूं, फिर इसे निजी एक्सेस का उपयोग करके विरासत में मिला। जब मैं पहुंच स्तर को सार्वजनिक करने की कोशिश करता हूं, तो यह काम करता है! क्या यह काम करने का अनुमान है? या यह संकलक पर एक बग है? मेरी समझ के लिए, पहुंच स्तर को बहाल करने के लिए किसी सदस्य के पहुंच स्तर को बढ़ावा देने या स्थानांतरित करने के लिए उपयोग नहीं किया जाना चाहिए।

कोड स्निपेट:

class base { 
    public: 
    void method() {} 
    void method(int x) {} 
    protected: 
    void method2() {} 
}; 

class derived : private base { 
    public: 
    base::method; // Here, i want to restore only the none parameterized method 
    base::method2; // method2 is now public?? 
}; 
+0

बीटीडब्लू- आधार :: विधि' का उपयोग कर 'बेस :: विधि' की तरह एक घोषणा है? – Kos

+0

@ कोस, हां, लेकिन यह अब 'बेस :: विधि' कहने के लिए मान्य नहीं है, सी ++ 0x में। इसे एन 3225 ड्राफ्ट द्वारा हटा दिया गया था। –

उत्तर

4

एक using घोषणा के माध्यम से विरासत में मिला कार्यों की पहुंच बदलने सरल कारण के लिए दिए गए अधिभार पर चुनिंदा नहीं किया जा सकता है कि एक using घोषणा केवल एक नाम कथात्मक क्षेत्र में का परिचय और परिभाषा से, काम करता है कि भार के समान हिस्सा नाम।

एकमात्र विकल्प मैं यहाँ देख तुच्छ अग्रेषण कार्यों का उपयोग करने के लिए है:

class derived : private base 
{ 
public: 
    void method() { base::method(); } 

    using base::method2; // method2 is now public 
    // method(int) stays inaccessible 
}; 

मैं काफी यकीन है कि मैं अपने दूसरे प्रश्न समझ में नहीं हूँ, लेकिन हाँ: आप के माध्यम से एक व्युत्पन्न वर्ग में आधार सदस्यों पहुंच को बदल सकते हैं using घोषणाएं।

+0

बिल्कुल सही, धन्यवाद .. दूसरे प्रश्न के लिए @DeadMG उत्तर के साथ इसे गठबंधन करें और हम प्रश्न हल हल कर सकते हैं .. –

1

आप का उपयोग, दर असल बहाल नहीं है। आप एक्सेस सेट करें। जैसा कि आप ऊपर कर रहे हैं, आप किसी भी विधि के लिए स्पष्ट रूप से पहुंच सेट कर सकते हैं, जिसमें पहले private के रूप में घोषित किया गया था।

1

संरक्षित विधियों को सार्वजनिक होने से रोकना असंभव होगा यदि व्युत्पन्न वर्ग ऐसा चाहता था, क्योंकि आप केवल एक मामूली रैपर लिख सकते थे और कर सकते थे। private एक और मामला है।

+0

akh ... हाँ .. यह समझ में आता है .. धन्यवाद .. मैं "सी ++ पूर्ण संदर्भ 4 वें एड" से एक अध्याय पढ़ रहा था, और एक पैराग्राफ बता रहा है: "आप एक्सेस अधिकारों को पुनर्स्थापित करने के लिए एक एक्सेस घोषणा का उपयोग कर सकते हैं सार्वजनिक और संरक्षित सदस्य। हालांकि, आप किसी सदस्य की पहुंच स्थिति को बढ़ाने या कम करने के लिए पहुंच घोषणा का उपयोग नहीं कर सकते हैं। उदाहरण के लिए, बेस क्लास में निजी के रूप में घोषित सदस्य व्युत्पन्न वर्ग द्वारा सार्वजनिक नहीं किया जा सकता है। (यदि सी ++ अनुमति है ऐसा होने पर, यह encapsulation तंत्र को नष्ट कर देगा!) ".. तो मुझे लगता है कि वह जनता के लिए था और उसी स्तर पर संरक्षित किया गया था .. –

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