2012-12-19 11 views
6

मैं निम्नलिखित वर्गों है:instanceof ग में वस्तुओं ++ (नहीं संकेत) के लिए

class Object { ... } 

class MyClass1: public Object { ... } 

class MyClass2: public Object { ... } 

और एक ढेर: std::stack<Object> statesObjects;

MyClass1 c1; 
MyClass2 c2; 

statesObjects.push(c1); // okay 
statesObjects.push(c2); // okay 

कैसे मैं उन्हें बाहर पॉप और कम से तत्व प्राप्त कर सकते हैं स्टैक के सिर (top() के साथ) dynamic_cast के बिना, क्योंकि मैं यहां पॉइंटर्स के साथ काम नहीं करता हूं?

उत्तर

8

के समान हैं संक्षिप्त उत्तर, के साथ अपने ढेर के रूप में-है आप पॉप नहीं कर सकते कि है बाहर व्युत्पन्न-वर्ग प्रकार तत्वों के रूप में तत्व। उन्हें स्टैक में डालकर आपके पास कटा हुआ उन्हें स्टैक के तत्व वर्ग में कटा हुआ है। यही है, केवल उस बेस क्लास भाग को ढेर में कॉपी किया गया है।

आप प्रदान की है कि स्थिर जाना जाता वर्ग बहुरूपी है संकेत के एक ढेर हो सकता है, फिर भी, और फिर आप dynamic_cast प्रदान की स्थिर में जाना जाता वर्ग कम से कम एक virtual सदस्य समारोह है, या के रूप में मानक का कहना है कि उपयोग कर सकते हैं, ।

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

+0

मदद के लिए धन्यवाद। – ron

2

जब आप सुपरक्लास के उदाहरण के लिए सबक्लास असाइन करते हैं, तो आप उन्हें अपने मूल वर्गों में पॉप नहीं कर सकते हैं, यह सुपरक्लास के उदाहरण में sliced प्राप्त करता है। जो stack में हैं c1 और c2 की यानी प्रतियां अब Object के उदाहरण और नहीं उनके मूल वर्गों

How can I make the method of child be called: virtual keyword not working?

2

भले ही आप अपनी कक्षा में व्युत्पन्न क्लास ऑब्जेक्ट को स्टोर करते हैं, भले ही संग्रहित हो जाता है केवल ऑब्जेक्ट का बेस क्लास हिस्सा होता है। संक्षेप में आपको ऑब्जेक्ट स्लाइसिंग मिलती है।

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

अच्छा पढ़ें:
What is object slicing?

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