मैं वर्तमान में एक गैर RTTI मंच (Android) पर RTTI सामान के बहुत सारे का उपयोग करता है एक तीसरे पक्ष के पैकेज एकीकरण पर काम कर रहा हूँ बिना एक हीरे की आकृति विरासत में मिला वस्तु downcasting। असल में, मैंने अपना खुद का आरटीटीआई कार्यान्वयन किया लेकिन मैं एक समस्या पर फंस गया हूं।सी ++ - RTTI/dynamic_cast
मुद्दा यह है कि बहुत से वर्गों में हीरा विरासत समस्या होती है क्योंकि सभी वर्ग समान आधार वर्ग (वस्तु) से प्राप्त होते हैं .. और इसलिए, यदि मैं बेस क्लास से व्युत्पन्न कक्षा में उतरना चाहता हूं, मुझे गतिशील_कास्ट का उपयोग करना है - लेकिन आरटीटीआई उपलब्ध नहीं है! गतिशील_कास्ट के बिना वर्चुअल विरासत होने पर मैं ऑब्जेक्ट को पैरेंट से बच्चे में कैसे परिवर्तित करूं?
ऐसा नहीं है कि तरह लग रहा है:
class A
{
public:
virtual char* func() { return "A"; };
};
class B : public virtual A
{
public:
//virtual char* func() { return "B"; };
};
class C : public virtual A
{
public:
//virtual char* func() { return "C"; };
};
class D : public B, public C
{
public:
//virtual char* func() { return "D"; };
};
D d;
A* pa = static_cast<A*>(&d);
D* pd = static_cast<D*>(pa); // can't do that! dynamic_cast does work though...
उन मेरी त्रुटियाँ हैं:
त्रुटि C2635: एक 'डी *' के लिए परिवर्तित नहीं कर सकते एक 'ए *'; एक आभासी आधार वर्ग से रूपांतरण
निहित हैत्रुटि C2440: 'आरंभ': 'test_convert :: डी *' आधार से कास्ट करने के लिए 'test_convert :: एक *' से परिवर्तित नहीं कर सकते प्राप्त होने वाले dynamic_cast की आवश्यकता है या static_cast
कोई भी विचार?
हे, अच्छी तरह से एमएस कोड से वर्चुअल कीवर्ड को हटाने के लिए कहता है और यह समस्या को हल करेगा। त्रुटि के लिए उनके दस्तावेज़ देखें, मैं मजाक नहीं कर रहा हूँ। –
हम ... ठीक है, ऐसा करने से मुझे त्रुटि 2594 मिलती है (http://msdn.microsoft.com/en-us/library/5xata8be.aspx देखें)। अब, इसे ठीक करने के लिए, वे "static_cast (static_cast (पी)) जैसे रूपांतरण के अनुक्रम का उपयोग करने का सुझाव देते हैं;"। विचार अच्छा है, लेकिन हम केवल तभी ऐसा कर सकते हैं जब हम वास्तव में पूरे विरासत के पेड़ को जानते हों .... और यह हमेशा ऐसा नहीं होता है। फिर भी, यह मानता है कि वर्चुअल पैरेंट क्लास को डुप्लिकेट किया जा सकता है (मेरे मामले में यह ठीक है)। तो मैं इसे आज़माउंगा ... लेकिन ऐसा करने के लिए, मुझे पदानुक्रम से बच्चे को पदानुक्रम प्राप्त करने का एक तरीका खोजना होगा। –
Adam
एंड्रॉइड ने आपको बताया कि एंड्रॉइड एक गैर-आरटीआई मंच है? आर 5 और नए एनडीके को आरटीटीआई का समर्थन करना चाहिए (मुझे विश्वास है कि आपको इसे '-फ्रेटी' के साथ चालू करने की आवश्यकता है, लेकिन इसे तब काम करना चाहिए)। पुराने प्लेटफ़ॉर्म के लिए भी, क्योंकि यह सभी स्थिर रूप से जुड़ा हुआ है। –