का उपयोग कर मैं सी ++ 0 एक्स/11 में स्मार्ट पॉइंटर्स के साथ काम करना शुरू कर रहा हूं और मैंने एक असाधारण स्थिति में भाग लिया है। मैं share_ptr का उपयोग कर किसी ऑब्जेक्ट का उदाहरण डालना चाहता हूं।अप-कास्टिंग std :: shared_ptr std :: dynamic_pointer_cast
वर्ग कक्षा बेस से विरासत को बढ़ाता है, जहां बेस क्लास में इसे पॉलीमोर्फिक बनाने के लिए आभासी विनाशक होता है (अन्यथा गतिशील_पोइंटर_कास्ट गैर-पॉलिमॉर्फिक क्लास कास्टिंग के बारे में शिकायत करता है)।
इसलिए यदि:
std::shared_ptr<Base> obj = std::make_shared<Base>();
और फिर मुझे क्या करना:
obj = std::dynamic_pointer_cast<Extend>(obj);
- यह सुरक्षित है?
- ऑब्जेक्ट के अन्य पॉइंटर्स के साथ क्या होता है? क्या केवल ओबीजे इसे विस्तार के रूप में पेश कर रहा है, जबकि अन्य साझा पॉइंटर्स अभी भी इसे बेस के रूप में मानेंगे?
- क्या यह एक ही उदाहरण को अपस्टास्ट करना सुरक्षित है या मुझे कुछ और करना चाहिए?
संपादित करें: उत्तर के लिए धन्यवाद। असली सवाल यह था कि मैं इस सवाल से पूछ रहा था कि एक्सएमएल दस्तावेज़ों को एक सैक्स पार्सर का उपयोग करना है, लेकिन मुझे ऊपर/नीचे कास्टिंग के साथ ले जाया गया। क्या मैं इन सबसे छुटकारा चाहता था:
std::shared_ptr<Extend> ex = std::dynamic_pointer_cast<Extend>(obj);
obj = ex;
लेकिन यह सब पर कोई मतलब नहीं है, बजाय मैं सिर्फ एक वस्तु कारखाने का उपयोग करेंगे।
कक्षा बी {}; कक्षा डी: बी {} बी * से डी * में रूपांतरण ** डाउन ** कास्टिंग है, जबकि डी * से बी * में रूपांतरण ** ** ** कास्टिंग है। मुझे लगता है कि आपके पास दिशानिर्देश अन्य तरीकों से हैं। –