मैं एक जावा प्रोग्रामर हूं और हाल ही में सी ++ का अध्ययन करना शुरू कर दिया है। मैं कुछ से उलझन में हूँ।मैं सामान्य चर के साथ बहुरूपता क्यों नहीं कर सकता?
मैं समझता हूं कि सी ++ में, पॉलिमॉर्फिक व्यवहार प्राप्त करने के लिए आपको पॉइंटर्स या संदर्भों का उपयोग करना होगा। उदाहरण के लिए, एक लागू विधि getArea()
के साथ कक्षा Shape
पर विचार करें। इसमें कई उप-वर्ग हैं, प्रत्येक ओवरराइडिंग एरिया() अलग-अलग हैं।
void printArea(Shape* shape){
cout << shape->getArea();
}
समारोह सही getArea()
कार्यान्वयन कहता है, के लिए ठोस Shape
सूचक अंक के आधार पर: निम्नलिखित समारोह पर विचार की तुलना में।
यह वही काम करता है:
void printArea(Shape& shape){
cout << shape.getArea();
}
हालांकि, निम्न विधि polymorphicaly काम नहीं करता:
void printArea(Shape shape){
cout << shape.getArea();
}
, एक ही क्या Shape
की ठोस तरह समारोह में पारित हो जाता है कोई फर्क नहीं पड़ता getArea()
कार्यान्वयन कहा जाता है: Shape
में डिफ़ॉल्ट एक।
मैं इसके पीछे तकनीकी तर्क समझना चाहता हूं। पॉलीमोर्फिज्म पॉइंटर्स और संदर्भों के साथ क्यों काम करता है, लेकिन सामान्य चर के साथ नहीं? (और मुझे लगता है कि यह न केवल फ़ंक्शन पैरामीटर के लिए सही है, बल्कि किसी भी चीज़ के लिए)।
कृपया समझने में मेरी सहायता के लिए, इस व्यवहार के तकनीकी कारणों की व्याख्या करें।
यह सहायक हो सकता है। http://stackoverflow.com/questions/7516545/why-is-object-slice-needed-in-c-why-it-is-allowed-for-more-bugs –
यह जानना भी उपयोगी हो सकता है कि जावा में सभी वस्तुओं वास्तव में असली वस्तुओं के लिए संकेतक हैं। इसलिए, यदि आपके पास कक्षा आकार है, तो "आकार ए = बी" केवल पॉइंटर को वास्तविक वस्तु पर आंतरिक रूप से प्रतिलिपि बनाता है, और आंतरिक संदर्भ गणना को बढ़ाता है। जब किसी ऑब्जेक्ट के सभी संदर्भ चले जाते हैं, तो यह जावा के कचरा संग्रह के अधीन हो जाता है। सी ++ में, आप वास्तविक वस्तुओं के साथ खेलना चाहते हैं। उन्हें चारों ओर कॉपी करें, इत्यादि यही कारण है कि बहुरूपता केवल पॉइंटर्स (या संदर्भ, जो पॉइंटर्स के लिए ज्यादातर वाक्य रचनात्मक चीनी हैं) के साथ काम करती है। –
फ़ंक्शन को केवल 'आकार' प्राप्त होता है। यदि आप उप प्रकार (या किसी अन्य प्रकार) को पास करते हैं तो इसे 'आकार' में परिवर्तित किया जाता है। – Galik