2009-06-08 3 views
11

मैं सी ++ एक समय में नहीं किया है और समझ नहीं क्यों निम्नलिखित काम नहीं करता:मैं व्युत्पन्न वर्ग के उदाहरण से संरक्षित सदस्य तक क्यों नहीं पहुंच सकता?

class A { 
protected: 
    int num; 
}; 

class B : public A { 
}; 

main() { 
    B * bclass = new B(); 
    bclass->num = 1; 
} 

संकलन इस निर्माण करता है:

त्रुटि C2248: 'एक :: संख्या' : कक्षा 'ए' में घोषित संरक्षित सदस्य तक नहीं पहुंच सकता

सदस्यों को संरक्षित वर्गों द्वारा संरक्षित नहीं किया जाना चाहिए?

मुझे क्या याद आ रही है?

उत्तर

31

हाँ संरक्षित सदस्य व्युत्पन्न कक्षाओं द्वारा सुलभ हैं लेकिन आप इसे मुख्य() फ़ंक्शन में एक्सेस कर रहे हैं, जो पदानुक्रम के बाहर है। यदि आप कक्षा बी में कोई विधि घोषित करते हैं और संख्या को एक्सेस करते हैं तो यह ठीक होगा।

+0

धन्यवाद! मुझे अब मेरी गलती दिखाई दे रही है –

13

हां, संरक्षित सदस्य व्युत्पन्न वर्ग द्वारा उपलब्ध हैं, लेकिन केवल कक्षा के भीतर से ही।

उदाहरण:

#include <iostream> 

class A { 
    protected: 
    int num; 
}; 

class B : public A { public: 
    void printNum(){ 
     std::cout << num << std::endl; 
    } 

}; 

main() { 
    B * bclass = new B(); 
    bclass->printNum(); 
} 

num का मूल्य प्रिंट आउट होगा, लेकिन num वर्ग B से एक्सेस किया जाता है। num को इसे bclass->num के रूप में एक्सेस करने में सक्षम होने के लिए सार्वजनिक घोषित किया जाना होगा।

8

यह बी के कार्यों के दायरे में पहुंच योग्य है, लेकिन आप इसे मुख्य रूप से एक्सेस करने का प्रयास कर रहे हैं।

6

लेकिन आप व्युत्पन्न कक्षा से इसे एक्सेस नहीं कर रहे हैं। आप इसे मुख्य() से एक्सेस कर रहे हैं।

3

"संरक्षित" का अर्थ किसी सदस्य फ़ंक्शन के बाहर पहुंच से प्राप्त किया गया है, या व्युत्पन्न वर्ग के सदस्य फ़ंक्शन। "मुख्य" फ़ंक्शन किसी भी वर्ग का सदस्य नहीं है, लेकिन यह सीधे सदस्य चर का उपयोग करने का प्रयास कर रहा है।

4

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

class A { 
    private: int privateNum; 

    protected: int protectedNum; 

    public: int publicNum; 

    void SetNumbers(int num) { 
     privateNum = num; //valid, private member can be accessed in member function 
     protectedNum = num; //valid, protected member can be accessed in member function 
} 

void main() { 
    A classA; 
    classA.privateNum = 1; //compile error can't access private member 
    classA.protectedNum = 1; //compile error can't access protected member 
    classA.publicNum = 1; //this is OK 
    classA.SetNumbers(1); //this sets the members not accessible directly 
} 

जब आप संरक्षित सदस्यों के साथ कक्षा से प्राप्त होते हैं तो अंतर प्रभावी होता है।

class B : public A { 
} 

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

class B : public A { 
public: 
    void SetBNumbers(int num) { 
     privateNum = num; //compile error, privateNum can only be accessed by members of A, not B 
     protectedNum = num; //this works, as protected members can be accessed by A and B 
    } 
} 

void main() { 
    B classB; 
    classB.publicNum = 1; //valid, inherited public is still public 
    classB.protectedNum = 1; //compile error, can't access protected member 
    classB.privateNum = 1; //compile error, B doesn't know that privateNum exists 
    classB.SetBNumbers(1); //this sets the members not accessible directly 
} 
0

हाँ आप मुख्य function.But में सुरक्षित डेटा के सदस्यों का उपयोग नहीं कर सकते हैं व्युत्पन्न कॉल में समारोह बनाने के द्वारा मुख्य में सुरक्षित डेटा सदस्यों पहुँच सकते हैं।

+0

क्या इस प्रश्न के लिए पहले से ही पर्याप्त उत्तर नहीं हैं? – matsjoyce