2010-10-01 30 views
35

मैं हमेशा पॉलिमॉर्फिज्म के लिए पॉइंटर्स का उपयोग करने के बारे में सोचता हूं। कैनोलिक उदाहरण का उपयोग करना:क्या पॉलीमोर्फिज्म के संबंध में संदर्भ और पॉइंटर्स बराबर हैं?

DrawEngine::render(Shape *shape) 
{ 
    shape->draw(); 
    shape->visible(true); 
} 

और विभिन्न आकार व्युत्पन्न कक्षाओं में पॉइंटर में गुजरना। क्या यह संदर्भों के साथ ही काम करता है?

engine.render(myTriangle); // myTriangle instance of class derived from Shape 

इस काम करता है, वहाँ दो मामलों के बीच कोई अंतर है:

DrawEngine::render(Shape &shape) 
{ 
    shape.draw(); 
    shape.visible(true); 
} 

यह करने के लिए भी मान्य है? मैंने स्ट्राउस्ट्रप में जानकारी खोजने की कोशिश की, लेकिन मुझे कुछ भी नहीं मिला।

मैंने इसे फिर से खोल दिया क्योंकि मैं सिर्फ एक और अधिक खोजना चाहता था।

तो कम से कम एक अंतर गतिशील_कास्ट है। मेरे लिए, बहुरूपता में गतिशील_कास्ट का उपयोग शामिल है।

मैं

Rhomboid & r = dynamic_cast<Rhomboid &>(shape); 

जा सकते हैं अगर कलाकारों में विफल रहता है तो क्या होगा? क्या यह कोई अलग है?

Rhomboid * r = dynamic_cast<Rhomboid*>(&shape); 

उत्तर

38

पॉलिमॉर्फिज्म के संबंध में, संदर्भ पॉइंटर्स की तरह ही काम करते हैं।

+2

@ pm100:। सीधे, सुनिश्चित करें, लेकिन वहाँ विभिन्न पहलुओं हैं। उदाहरण के लिए, 'dynamic_cast' एक खराब कलाकार पर वापस लौटने के बजाय अपवाद फेंक देगा। – GManNickG

+2

@GMan: मैं पॉइंटर्स और संदर्भों के बीच मूल अंतर के रूप में 'dynamic_cast' उदाहरण के बारे में सोचता हूं: पॉइंटर्स कानूनी रूप से नल हो सकते हैं, जबकि संदर्भ नहीं हो सकते हैं। प्रश्न के दिल, जैसा कि मैंने इसे पढ़ा है, यह है कि वर्चुअल टेबल के संबंध में संदर्भ समान व्यवहार करते हैं या नहीं। इसलिए संक्षिप्त जवाब। –

+1

जिस तरह से मैं इसे देखता हूं, संदर्भ पॉइंटर्स के शीर्ष पर वाक्य रचनात्मक चीनी से थोड़ा अधिक प्रतीत होता है। –

0

पॉइंटर्स अन्य तरीकों से भी मदद करते हैं। एक स्ट्रिंग को पार करने और इसे फ़ंक्शन में char * पैरामीटर के रूप में स्वीकार करने की तरह।

जगह में एक स्ट्रिंग पीछे की पुरानी उदाहरण पर विचार करें: इन संदर्भों का उपयोग कर की तरह स्ट्रिंग हेरफेर के लिए

void reversestring(char* myString) 
{ 
int firstPos=0; 
int lastPos=myString.length - 1; 
while (firstPos < lastPos) 
{ 
    char temp=myString[firstPos]; 
    myString[firstPos]=myString[lastPos]; 
    myString[lastPos]=temp; 
    firstPos++; 
    lastPos--; 
} 
} 

लेखन कोड इतना आसान नहीं होगा।

+0

myString.length?क्या वह सी ++ है? –

+1

@TheLightSpark यह मान्य होगा यदि 'myString'' std :: string' था, लेकिन मुझे विश्वास है कि यह कच्चे सी स्ट्रिंग के लिए अमान्य है। साथ ही, 'लंबाई' एक फंक्शन कॉल होना चाहिए, लेकिन यह नाइटपिकिंग है। –

7

dynamic_cast के संबंध में, एक असफल कलाकार पॉइंटर्स के साथ एक नलपोइंटर उत्पन्न करता है, और परिणाम के साथ bad_cast (आईआईआरसी) अपवाद का फेंक देता है।

एक कारण यह है कि मान्य नल-संदर्भ जैसी कोई चीज़ नहीं है।

और संभवतः एक अन्य कारण (लेकिन यह केवल एक अनजाने में उपयोगी उभरती विशेषता हो सकती है) यह है कि कभी-कभी किसी को अपवाद की आवश्यकता होती है और कभी-कभी किसी को आसानी से जांच करने की आवश्यकता होती है, और इससे कोई फर्क नहीं पड़ता कि आपके पास कोई संदर्भ या सूचक है या नहीं जिस व्यवहार को आप चाहते हैं उसे प्राप्त करने के लिए हाथ में अधिकांश डेरफ़्रेंसिंग या एड्रेस ऑपरेटर होता है।

चीयर्स & hth,

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