c++ - C2440 when assigning `Derived**` to `Base**` -
मान लें कि मेरे पास एक
आधार
वर्ग और एक व्युत्पन्न
वर्ग है:
वर्ग बेस {}; श्रेणी प्राप्त: सार्वजनिक बेस {};
मैं मजेदार
अब स्पष्ट रूप से व्युत्पन्न
को myBase
की सामग्री के लिए एक सूचक निर्दिष्ट कर सकता हूँ :
शून्य मजेदार (बेस ** myBase) {व्युत्पन्न * myDerived = new derived (); * MyBase = myDerived; } Int _tmain (int argc, _TCHAR * argv []) {base * myBase = NULL; मज़े (& amp; myBase); वापसी 0; }
अब, समस्या यह है कि मैं बेस *
की एक सरणी को आवंटित करना चाहता हूं (मैं हस्ताक्षर के बाद से तीन-स्टार को मुखौटा करने के लिए टाइप टाइप किए नहीं कर सकता मजेदार
का ऑटो-जेनरेट होता है):
शून्य मजेदार (बेस *** मेराबेस) {डिलीट ** myDerived = new derived * (); * MyBase = myDerived; }
मुझे क्यों C2440 मिलता है: '=': 'डिरिएटेड **' से 'बेस **' में परिवर्तित नहीं किया जा सकता है
जबकि व्युत्पन्न *
से बेस *
बिल्कुल ठीक है?
उत्तर में झूठ में बताता है कि क्या वास्तव में सी ++ में एक डास्ट बेस पॉइंटर है निम्नलिखित सरल उदाहरण पर विचार करें:
<पूर्व> struct ए {std :: uint32_t a; }; Struct बी {std :: uint32_t b; }; संरचना डी: ए, बी {std :: uint32_t d; };
यहां डी के पास दो आधार,
ए
और बी
है। लेकिन उनमें से केवल एक डी
की शुरुआत में रह सकता है (कहें कि यह ए है), इसलिए जब आप दूसरे को
डी कन्वर्ट करते हैं एक (
बी
), संकेतक के मान को बदलने की जरूरत है, किसी बिंदु पर डी के मध्य में इंगित करें।
इस पर विचार करने के लिए, विचार करें कि किस तरह की वस्तु
डी आपकी स्मृति में दिखती है:
0 1 2 3 4 5 6 7 8 9 एबी [ए :: ए] [बी :: बी] [डी :: डी] ^ ए डी * यहां इंगित करेगा ^ ए ए * यहां इंगित करेगी ^ ए बी * यहां इंगित करना चाहिए
जबकि < कोड> डी इन सभी तीन पूर्णांकों की अपेक्षा करते हैं, जब इस ऑब्जेक्ट को A
के रूप में सोचते हैं, हम केवल पहले की अपेक्षा करते हैं, लेकिन सूचक (संख्यात्मक रूप से) समान है, हम केवल उम्मीद करते हैं एक छोटा वस्तु हालांकि, जब इसे B
के रूप में सोचते हैं, तो हमें बीच में एक पूर्णांक को इंगित करने की आवश्यकता होती है।
जब आप ऐसा एक सूचक में करते हैं, तो संकलक का ध्यान रखना होगा यह आपके लिए सूचक के मूल्य को उचित रूप से बदलकर हालांकि, जब आप पॉइंटर्स के सरणी के लिए ऐसा करते हैं, तो संकलक को उस के सभी तत्वों पर एक पाश को फेंकना होगा और हर एक पॉइंटर को सही करना होगा - जब वास्तव में यह भी नहीं पता कि सरणी कहाँ से समाप्त होती है (चूंकि कंपाइलर केवल एक सूचक को देखता है
इसलिए सी ++ इस तरह के रूपांतरण की अनुमति नहीं देता है।
Comments
Post a Comment