2010-03-28 6 views
11

निम्नलिखित सी ++ प्रोग्राम के बारे में:व्युत्पन्न और बेस कक्षाओं के बीच पॉइंटर-टू-पॉइंटर का रूपांतरण?

error: invalid conversion from ‘Child**’ to ‘Base**’ 

मेरा प्रश्न दो भागों में है:

class Base { }; 

class Child : public Base { }; 

int main() 
{ 
    // Normal: using child as base is allowed 
    Child *c = new Child(); 
    Base *b = c; 

    // Double pointers: apparently can't use Child** as Base** 
    Child **cc = &c; 
    Base **bb = cc; 

    return 0; 
} 

जीसीसी पिछले काम विवरण में निम्न त्रुटि पैदा करता

  1. वहाँ क्यों है कोई चाइल्ड ** से बेस ** तक अंतर्निहित रूपांतरण?
  2. मैं इस उदाहरण को सी-स्टाइल कास्ट या reinterpret_cast के साथ काम कर सकता हूं। इन जानवरों का उपयोग करना मतलब है कि सभी प्रकार की सुरक्षा को फेंकना। क्या इन बिंदुओं को अंतर्निहित रूप से डालने के लिए कक्षा परिभाषाओं में कुछ भी जोड़ा जा सकता है, या कम से कम वाक्यांश को इस तरह से बदलना है जिससे मुझे static_cast का उपयोग करने की अनुमति मिलती है?
+0

कई प्रोग्रामिंग भाषाओं में इस प्रश्न पर बदलाव SO पर सबसे आम प्रश्नों में से एक है। लेकिन हर कोई एक ही भाषा के लिए थोड़ा अलग तरीके से वाक्यांश करता है, इसलिए डुप्लिकेट ढूंढना मुश्किल हो सकता है। –

+0

छायादार जानवरों से बचने के लिए इस उदाहरण को "फिक्सिंग" इस बात पर निर्भर करेगा कि आप पहले स्थान पर पॉइंटर-टू-पॉइंटर का उपयोग क्यों कर रहे हैं। – aschepler

उत्तर

19

यदि यह अनुमति दी गई थी, तो आप इस लिख सकते हैं:

*bb = new Base; 

और cBase का एक उदाहरण की ओर इशारा करते हो जाएंगे। खराब।

+0

छोटे सुधार - वह कह सकता है '** बीबी = नया बेस();' बस '* बीबी' की अनुमति नहीं दी जाएगी। – Phil

+4

@ फिल: 'नया' एक सूचक देता है, जो टाइप '* बेस' है। 'बीबी' प्रकार' ** बेस' है। इस प्रकार '* बीबी' dereference का सही स्तर है। – Amber

+1

तर्क अनिवार्य रूप से comp.lan.gc के समान है, 'char **' और 'char const **' के गैर-समकक्षता के बारे में अक्सर पूछे जाने वाले प्रश्न: http://c-faq.com/ansi/constmismatch.html –