2012-12-18 14 views
18

क्या आप कृपया बता सकते हैं कि निम्नलिखित कोड संकलित क्यों होता है और ठीक काम करता है (जीसीसी-4.3.4 पर चेक किया गया)। मैंने सोचा कि चुनिंदा विरासत सदस्यों/विधियों तक पहुंच को कमजोर या मजबूत भी नहीं कर सकती है। क्या यह encapsulation नियम तोड़ नहीं है?चुनिंदा विरासत सी ++

#include <iostream> 

class A { 
protected: 
    void foo() { std::cout << "foo" << std::endl; } 
}; 

class B : private A { 
public: 
    using A::foo; //foo() becomes public?! 
}; 

int main() { 
    B b; 
    b.foo(); 
    return 0; 
} 
+0

+1। –

+1

मानक कंटेनर से निजी रूप से विरासत में मिलने पर आप ऐसा करते हैं। असल में, आप उथल-पुथल को रोकते हैं (इसका तात्पर्य है कि आपको आभासी विनाशक की आवश्यकता नहीं है), लेकिन आप कुछ परिचालनों को अनुमति देते हैं जो कि अनुपूरक/आगे बढ़ने के लिए कठिन होंगे। –

उत्तर

12

भाषा बिंदु से, इसमें कुछ भी गलत नहीं है (चाहे यह अच्छा डिजाइन एक और मामला है)।

कोई भी वर्ग व्यापक दर्शकों की चीज़ों का खुलासा करने का विकल्प चुन सकता है जिनके पास इसका उपयोग है।

class B : private A { 
public: 
    void bar() { foo(); } 
}; 
सिवाय इसके कि

यहाँ foo() प्रॉक्सी द्वारा सामने आ रहा है:

सिद्धांत रूप में, अपने उदाहरण के लिए अलग नहीं है।

आप जो नहीं कर सकते हैं वह विपरीत है: सार्वजनिक रूप से व्युत्पन्न वर्ग आधार वर्ग के माध्यम से सुलभ चीजों तक पहुंच प्रतिबंधित नहीं कर सकता है। मुझे कुछ सिखाने के लिए

+1

निश्चित रूप से आप कर सकते हैं; 'संरचना ए {int i; }; संरचना बी: एक {निजी: ए :: i का उपयोग कर; }; 'नाम' बी :: i' उपनाम और छाया 'ए :: i' निजी पहुंच के साथ। बेशक, यह आपको 'बी.ए :: i' लिखने से नहीं रोकता है, जो संभवतः आपके लिए है। – ecatmur

+1

@ecatmur: 'B' चीजों को खराब कर सकता है, लेकिन यह पहुंच प्रतिबंधित नहीं कर सकता है। मैं हमेशा 'ए' के ​​संदर्भ को उजागर कर सकता हूं और 'ए' एपीआई का उपयोग कर सकता हूं: 'ए और ए = बी; a.i = 42; ' – NPE

+0

@ecatmur: शब्द * छुपा * की मेरी पसंद थोड़ा दुर्भाग्यपूर्ण थी। मैंने शब्द में सुधार किया है। – NPE