यह "स्लाइसिंग" नामक एक समस्या है।
Dog()
Dog
ऑब्जेक्ट बनाता है। यदि आप Dog().makeSound()
पर कॉल करना चाहते थे, तो यह "छाल" प्रिंट करेगा जैसा कि आप उम्मीद करते हैं।
समस्या यह है कि आप badDog
प्रारंभ कर रहे हैं, जो इस Dog
के साथ Animal
प्रकार का एक ऑब्जेक्ट है। चूंकि Animal
में केवल Animal
हो सकता है और Animal
से प्राप्त कुछ भी नहीं, Dog
का हिस्सा लेता है और इसके साथ स्वयं को प्रारंभ करता है।
badDog
का प्रकार हमेशा Animal
है; यह कभी और कुछ नहीं हो सकता है।
सी ++ में पॉलिमॉर्फिक व्यवहार प्राप्त करने का एकमात्र तरीका पॉइंटर्स का उपयोग कर रहा है (जैसा कि आपने अपने goodDog
उदाहरण के साथ प्रदर्शित किया है) या संदर्भों का उपयोग कर रहा है।
एक संदर्भ (जैसे, Animal&
) किसी भी प्रकार Animal
से ली गई और एक सूचक की एक वस्तु का उल्लेख कर सकते हैं (जैसे, Animal*
) किसी भी प्रकार Animal
से प्राप्त की एक वस्तु को इंगित कर सकते हैं। एक सादा Animal
, हालांकि, हमेशा Animal
है, और कुछ नहीं।
तरह जावा और सी # कुछ भाषाओं संदर्भ अर्थ विज्ञान, जहां चर (ज्यादातर मामलों में) कर रहे हैं सिर्फ वस्तुओं के लिए संदर्भ है, इसलिए दिए गए एक Animal rex;
, rex
वास्तव में कुछ Animal
करने के लिए सिर्फ एक संदर्भ है, और rex = new Dog()
rex
एक नया करने का उल्लेख करता है Dog
ऑब्जेक्ट।
सी ++ इस तरह से काम नहीं करता है: चर C++ में ऑब्जेक्ट्स का संदर्भ नहीं देते हैं, चर वस्तुएं हैं। आप सी ++ में कहते हैं rex = Dog()
, यह प्रतियां rex
में एक नया Dog
वस्तु, और के बाद से rex
प्रकार Animal
की वास्तव में है, यह कटा हुआ हो जाता है और सिर्फ Animal
भागों कॉपी हो। इन्हें मूल्य अर्थशास्त्र कहा जाता है, जो सी ++ में डिफ़ॉल्ट हैं। यदि आप सी ++ में संदर्भ अर्थशास्त्र चाहते हैं, तो आपको स्पष्ट रूप से संदर्भ या पॉइंटर्स का उपयोग करने की आवश्यकता है (इनमें से कोई भी सी # या जावा में संदर्भ के समान नहीं है, लेकिन वे अधिक समान हैं)।
स्रोत
2010-12-09 22:24:14
मुझे लगता है कि आपके चर के लिए कुछ नामकरण त्रुटियां हैं। – aioobe
कोड भी संकलित नहीं है। और 'शून्य शून्य()' ??? ईडब्ल्यू ... –
मुझे समझ में नहीं आ रहा है कि कोई इस सवाल को क्यों कम करेगा - यह न तो "अस्पष्ट" है और न ही "उपयोगी नहीं है"। डाउनवोट को अस्वीकार करने के लिए +1। सुंदर कुत्ते मेटाफोर के लिए – casablanca