सूचक रूपांतरण static_cast
के रूप में कार्य करता है। 5.2.9/2 कहते हैं,
हैं [A
] के प्रकार वस्तु वास्तव में प्रकार [B
] की एक वस्तु की एक subobject है, परिणाम [B
] के प्रकार संलग्न वस्तु को दर्शाता है। अन्यथा, कास्ट का परिणाम अव्यवस्थित है।
आपका वस्तु नहीं एक B
वस्तु का एक subobject है, इसलिए परिणाम अनिर्धारित रहता है।
भले ही आप reinterpret_cast
पर हों, परिणामी सूचक के माध्यम से ऑब्जेक्ट के मूल्य तक पहुंचने से व्यवहार को अपरिभाषित किया गया है क्योंकि यह सख्त एलियासिंग का उल्लंघन करता है। सी ++ 11 मानक में, 3।10/10:
एक कार्यक्रम निम्नलिखित प्रकार व्यवहार unde फाई नेड है में से एक के अलावा अन्य के glvalue के माध्यम से एक वस्तु की संग्रहीत मूल्य तक पहुँचने के लिए प्रयास करता है:
"एक व्युत्पन्न वर्ग उस ऑब्जेक्ट के डायनामिक प्रकार का जो कोई डेटा सदस्य या आभासी सदस्य फ़ंक्शंस नहीं जोड़ता है " निम्न सूची में है।
method1
वास्तव में क्या करता है, इस पर निर्भर करते हुए ऑब्जेक्ट के संग्रहीत मूल्य तक पहुंचने से बचना संभव हो सकता है। लेकिन मुझे यकीन नहीं है कि यह कभी भी संभव है। जब तक कि मानक में कहीं और नहीं कहा जाता है, मैं सुरक्षा के लिए मानता हूं कि गैर-स्थैतिक सदस्य फ़ंक्शन को मूल रूप से "ऑब्जेक्ट के संग्रहीत मूल्य तक पहुंचता है" भले ही फ़ंक्शन वास्तव में किसी भी डेटा सदस्यों का उपयोग न करे।
यह उन अजीब मामलों में से एक है जो शायद हर समय या लगभग हर समय अभ्यास में काम करेंगे। लेकिन इसकी गारंटी नहीं है, इसलिए यदि यह काम प्रतीत होता है और उत्सर्जित कोड ठीक दिखता है, तो आप डर में रहेंगे कि कुछ दिन एक नया अनुकूलन इसे तोड़ देगा।
एक बार परिभाषित होने के बाद, नए सदस्य कार्यों सहित नए सदस्यों को सी ++ कक्षाएं बंद कर दी गई हैं। इसलिए new A()
के साथ बनाई गई आपकी ऑब्जेक्ट में उसके सभी सदस्य फ़ंक्शंस हैं। बस एक गैर-सदस्यीय फ़ंक्शन लिखें - जब तक कि A
में protected
सदस्य हैं, तो उनके सदस्य फ़ंक्शन में A
पर समान पहुंच होगी। और यदि A
में protected
सदस्य हैं तो इससे प्राप्त होने का तरीका है, जिसे आप B
के उचित उदाहरण बनाने के लिए उपयोग करना चाहिए।
सदस्य समारोह वाक्य रचना मतलब है कि आप के लिए बहुत कुछ है, तो वर्ग के आधार पर A
आप लिखने में सक्षम हो सकता है:
B b = *a; // "copy" the object (give B a suitable ctor)
b.method1(); // act on it
*a = b; // copy it back (A needs copy assignment operator)
मुद्दों जाहिर है देखते हैं यहाँ है कि यह काम करना बंद कर सकता है: के साथ शुरू करने के लिए कि ऑब्जेक्ट कॉपी करने योग्य, थ्रेड-सुरक्षा भी है, और method1
b
पर कहीं भी पॉइंटर/संदर्भ संग्रहीत करता है जो b
नष्ट हो जाता है। सी ++ 11 में प्रतियां शायद दक्षता के लिए आगे बढ़ सकती हैं, लेकिन फिर भी मुझे आशा है कि आप इस बात से सहमत होंगे कि आपको सदस्य फ़ंक्शन सिंटैक्स का उपयोग करने के लिए कूदने के लिए हुप्स के लायक नहीं हैं।
नहीं, एक 'ए' 'बी' नहीं है। –
आपका प्रश्न आप जो पूछ रहे हैं उससे मेल नहीं खाता है। आपका प्रश्न कास्टिंग ऑब्जेक्ट्स के बारे में पूछता है, जबकि आपका कोड पॉइंटर्स कास्टिंग कर रहा है। – Mehrdad
संबंधित: http://stackoverflow.com/questions/11404209/c-memory-layout-of-inheritance – jogojapan