2013-04-04 13 views
5

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

अगर मैं एक आधार वर्ग ClassA है और एक अन्य ClassB यह से निकला है, मैं समझता हूँ मैं ClassA में virtual सदस्य कार्य हो सकता है कि है कि, जब ClassB में लागू, एक ClassB उदाहरण भले ही उस कहने पर बताया है में बुलाया जाएगा ClassA सूचक का उपयोग कर। इस virtual कीवर्ड के बिना, मुझे लगता है कि बेस क्लास कार्यान्वयन बेस क्लास पॉइंटर का उपयोग करते समय प्रबल होगा, फिर भी उप-वर्ग से तत्काल एक ऑब्जेक्ट पर काम कर रहा है, जो वास्तव में मुझे लगता है कि अगर ClassB में एक ही फ़ंक्शन का अपना कार्यान्वयन है इस तरह के मामले में प्रभावी रूप से अनदेखा किया जाता है।

क्या यह पॉलिमॉर्फिक व्यवहार की सही समझ है?

अब असली सवाल यह है कि आप बेस क्लास के लिए पॉइंटर का उपयोग करके ClassB का उपयोग कैसे करते हैं। मैं वास्तव में केवल दो तरीके के बारे में सोच सकते हैं:

  1. इन्स्टेन्शियशन के समय सूचक बनाएँ, एक समारोह है कि एक आधार वर्ग सूचक रिटर्न जबकि वास्तव में के बजाय उपवर्ग के लिए स्मृति आवंटन, उपवर्ग के निर्माता का उपयोग कर का उपयोग करते हुए। (क्या इस तरह के सृजन फ़ंक्शन का एक सामान्य नाम है?)
  2. static_cast का उपयोग करके किसी ऑब्जेक्ट को कास्ट करना और बेस क्लास को पॉइंटर को असाइन करना।

क्या ये बेस क्लास पॉइंटर्स को सबक्लास के ऑब्जेक्ट्स बनाने के लिए दो मुख्य तकनीक हैं?

+0

संबंधित: एक अन्य आम तरीका आप कार्रवाई में बहुरूपता देखेंगे एक समारोह कॉल के माध्यम से है वास्तव में http://stackoverflow.com/q/5854581/46821 –

उत्तर

9

सबसे आसान तरीका है बस इसे, कोई डाली आवश्यक आवंटित करने के लिए है:

ClassA *ptrA = new ClassB; 

आप सही है कि आप virtual कीवर्ड जरूरत बहुरूपी व्यवहार को सक्षम करने के लिए कर रहे हैं। इसके बारे में सोचने का एक तरीका यहां है। सी ++ किसी ऑब्जेक्ट के स्थिर प्रकार पर काम करता है। जब आप ptrA->foo() पर कॉल करते हैं, तो पॉइंटर का प्रकार ClassA* है। यदि वह फ़ंक्शन virtual घोषित नहीं किया गया है, तो यह फ़ंक्शन के ClassA के संस्करण को अंधाधुंध रूप से कॉल करेगा। कोई अन्य विकल्प नहीं है। लेकिन अगर foo()virtual है, तो यह रोकना और पूछना जानता है, "रुको, मैं वास्तव में किस प्रकार का हूं?" और उस मामले में उत्तर ClassB है, इसलिए यह ClassB के संस्करण को कॉल करेगा।

यह भी ध्यान रखें कि आपको इसे प्राप्त करने के लिए पॉइंटर्स की आवश्यकता नहीं है।

void bar(ClassA &aObj) 
{ 
    aObj.foo(); 
} 

// ... 
ClassB bObj; 
bar(bObj); 
+0

सादगी के लिए +1 :) – scones

+0

, मैं सिर्फ था संयोग से शब्दकोष में एक शब्द देखकर, शब्द * सुरुचिपूर्ण * था और मैंने डबल-टेक किया था जब परिभाषा वास्तव में आपके द्वारा प्रदान की गई सटीक कोड स्निपेट थी! – johnbakers

+0

+1 यह इंगित करने के लिए कि गतिशील आवंटन और पॉइंटर्स पॉलीमोर्फिज्म के लिए ऑर्थोगोनल हैं (भले ही अक्सर एक साथ उपयोग किया जाता है)। –

संबंधित मुद्दे