2013-04-21 10 views
6

के संदर्भ के माध्यम से वर्चुअल फ़ंक्शंस को कॉल करना यह कोड कंसोल पर उचित संदेश प्रिंट करने से इनकार करता है जब मैं इसे चलाता हूं। संदर्भों के बजाय पॉइंटर्स का उपयोग करना (-> इसके बजाए) काम करता है। मैं ओओपी के लिए नया हूं इसलिए अगर आपको यह हास्यास्पद लगता है तो मुझे माफ़ कर दो।बेस क्लास

#include <iostream> 

using namespace std; 

class instrument { 
public: 
    virtual void play(){} 
}; 

class drum : public instrument { 
public: 
    void play(){ 
     cout << "dum, dum" << endl; 
    } 
}; 

class piano : public instrument { 
public: 
    void play(){ 
     cout << "pling" << endl; 
    } 
}; 

int main(){ 
    instrument i; 
    piano p; 
    drum d; 

    instrument &pi = i; 
    pi.play(); // - 

    pi = p; 
    pi.play(); // pling 

    pi = d; 
    pi.play(); // dum, dum 
} 
+9

आप उस ऑब्जेक्ट से संदर्भ नहीं बदल सकते हैं जिस पर इसे प्रारंभ करने पर एक बार संदर्भित किया गया है। इस प्रक्रिया में अभी आपके फायरिंग असाइनमेंट ऑपरेटर (और ट्रिगरिंग [ऑब्जेक्ट स्लाइसिंग] (http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c/274634#274634)। – WhozCraig

+4

इसे एक उत्तर दें, क्या होगा, महोदय? – jrok

+0

एक साइड इश्यू, लेकिन आपको बेस क्लास में आभासी विनाशक बनाना होगा। –

उत्तर

15
instrument &pi = i; 

यहाँ आप pi बनाने instrument वस्तु i को देखें।

pi = p; 

यहाँ आप वस्तु pi से संबोधित किया जाता करने के लिए piano वस्तु p बताए जाते हैं। संदर्भ pipiano ऑब्जेक्ट पर रीबाउंड नहीं है। यह अभी भी पहले जैसा ही instrument ऑब्जेक्ट को संदर्भित करता है। यह सिर्फ अलग-अलग सामग्री को निहित रूप से जेनरेट किए गए डिफ़ॉल्ट असाइनमेंट ऑपरेटर का उपयोग करके असाइन किया गया है। (इस मामले में, असाइनमेंट का कोई प्रभाव नहीं पड़ता है, लेकिन मूल प्रकार के लिए व्युत्पन्न प्रकार को असाइन करना आमतौर पर ऑब्जेक्ट स्लाइसिंग में होता है।) जब आप pi.play() पर कॉल करते हैं, तो संदर्भ अभी भी instrument ऑब्जेक्ट को संदर्भित करता है और instrument::play निष्पादित किया जाता है।

बिंदु यह है कि, जब आप किसी भिन्न प्रकार के किसी भिन्न ऑब्जेक्ट पर इंगित करने के लिए पॉइंटर प्राप्त कर सकते हैं, तो आप संदर्भ के साथ ऐसा नहीं कर सकते हैं। यह हमेशा एक ही वस्तु पर इंगित करता है। आप एकाधिक संदर्भों का उपयोग करके अपना कोड ठीक कर सकते हैं:

instrument &pi = i; 
pi.play(); // - 

instrument &pp = p; 
pp.play(); // pling 

instrument &pd = d; 
pd.play(); // dum, dum 
+1

पॉइंटर्स थोड़ा और अधिक हैं संदर्भों से बहुमुखी और लचीला, वे नहीं हैं? – Venom

+0

@ वेनॉम संख्या। दोनों का उपयोग –

+1

@ वेनॉम है यदि आप उनकी कच्ची कार्यक्षमता पर विचार करते हैं तो वे अधिक लचीला हो सकते हैं। हालांकि, आप हमेशा उस लचीलापन नहीं चाहते हैं। वास्तव में, यह भी समस्याओं का कारण बन सकता है। नौकरी के लिए उपयुक्त प्रकार चुनें। –