मैं सामरिक कार्यक्षमता को छोड़कर कुछ कोड को दोबारा करने की कोशिश कर रहा हूं। मुझे किसी ऑब्जेक्ट को बेस इंटरफ़ेस में पॉइंटर कास्टिंग करने में परेशानी हो रही है और फिर बाद में व्युत्पन्न क्लास प्राप्त हो रही है। कार्यक्रम कुछ मामलों में इन वस्तुओं के उदाहरण बनाने के लिए एक फैक्ट्री ऑब्जेक्ट का उपयोग करता है।एकाधिक विरासत वाले वर्ग को नहीं डाला जा सकता
यहां कक्षाओं के कुछ उदाहरण दिए गए हैं जिनके साथ मैं काम कर रहा हूं।
// This is the one I'm working with now that is causing all the trouble.
// Some, but not all methods in NewAbstract and OldAbstract overlap, so I
// used virtual inheritance.
class MyObject : virtual public NewAbstract, virtual public OldAbstract { ... }
// This is what it looked like before
class MyObject : public OldAbstract { ... }
// This is an example of most other classes that use the base interface
class NormalObject : public ISerializable
// The two abstract classes. They inherit from the same object.
class NewAbstract : public ISerializable { ... }
class OldAbstract : public ISerializable { ... }
// A factory object used to create instances of ISerializable objects.
template<class T> class Factory
{
public:
...
virtual ISerializable* createObject() const
{
return static_cast<ISerializable*>(new T()); // current factory code
}
...
}
This question कास्टिंग के विभिन्न प्रकार क्या करना पर अच्छी जानकारी है, लेकिन यह मदद करने के लिए मुझे इस स्थिति को समझ नहीं है। Static_cast और नियमित कास्टिंग का उपयोग करके मुझे error C2594: 'static_cast': ambiguous conversions from 'MyObject *' to 'ISerializable *'
दें। गतिशील_कास्ट का उपयोग न्यूल को वापस करने के लिए createObject() बनाता है। NormalObject शैली कक्षाएं और MyObject का पुराना संस्करण कारखाने में मौजूदा static_cast के साथ काम करता है।
क्या इस कलाकार का काम करने का कोई तरीका है? ऐसा लगता है कि यह संभव होना चाहिए।
+1: यह भी जीसीसी पर काम किया। – Troubadour
बिल्कुल वही सवाल जो एफएक्यू सिफारिश करता है: http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.8 –
यह हल हो गया।मुझे एहसास नहीं था कि सार तत्वों को वस्तुतः प्राप्त करने की आवश्यकता थी। @ मार्क रान्ससम, महान लिंक के लिए धन्यवाद। वह पूरा पृष्ठ बहुत उपयोगी है। –