कास्टिंग मान लेते हैं इस तरह के वर्ग पदानुक्रम है करते हैं?एकाधिक वंशानुक्रम आधार वर्ग से अलग व्युत्पन्न वर्ग
महत्वपूर्ण: मुझे लगता है मुझे लगता है कि वस्तु नहीं जानता कि सी मैं सिर्फ पता है कि यह इंटरफ़ेस बी को लागू करता है
कास्टिंग मान लेते हैं इस तरह के वर्ग पदानुक्रम है करते हैं?एकाधिक वंशानुक्रम आधार वर्ग से अलग व्युत्पन्न वर्ग
महत्वपूर्ण: मुझे लगता है मुझे लगता है कि वस्तु नहीं जानता कि सी मैं सिर्फ पता है कि यह इंटरफ़ेस बी को लागू करता है
नहीं। यह संभव नहीं है (A*
से B*
तक प्रत्यक्ष कास्टिंग)।
क्योंकि A
और B
का पता class C
में विभिन्न स्थानों पर हैं। तो कलाकार हमेशा असुरक्षित रहेगा और संभवतः आप अप्रत्याशित व्यवहार में उतर सकते हैं। Demo।
कास्टिंग हमेशा class C
के माध्यम से जाना चाहिए। जैसे
A* pa = new C();
B* pb = static_cast<C*>(pa);
^^^^ go through class C
हाँ, आप पहली बार static_cast
सी * करने के लिए वस्तु है, तो आप इसे फिर से करने के लिए कर सकते हैं static_cast
चाहिए बी (हालांकि इस अंतिम कलाकार की आवश्यकता नहीं है, क्योंकि एक मानक रूपांतरण है)। मुझे यकीन नहीं है कि static_cast
आईएनजी ऑब्जेक्ट सीधे बी पर काम करेगा, कोशिश करें और देखें कि क्या आपको कंपाइलर त्रुटियां मिलती हैं। बी 0 पर reinterpret_cast
आईएनजी ऑब्जेक्ट आपको रनटाइम क्रैश मिलेगा, क्योंकि ए और बी के अलग-अलग पते होंगे यदि वे दोनों खाली नहीं हैं।
संपादित करें प्रश्न बदलने के बाद, अब आप जो करना चाहते हैं वह करना संभव नहीं है। आपको विरासत के पेड़ को ऊपर और नीचे सही पथ जानने की जरूरत है, क्योंकि गैर-खाली कक्षाओं के साथ कई विरासत वाले परिदृश्य में कास्टिंग सूचक में बदलाव का तात्पर्य है।
कृपया मेरा संपादन (महत्वपूर्ण) – Andrew
जब तक ऑब्जेक्ट बी से प्राप्त होता है, तब तक आप ऑब्जेक्ट को हमेशा बी पर डाल सकते हैं। और निश्चित रूप से, आप केवल इंटरफ़ेस बी में परिभाषित विधियों को कॉल कर सकते हैं, क्योंकि वर्चुअल पॉइंटर केवल बी द्वारा परिभाषित विधि तक पहुंच सकता है आभासी तालिका में।
किसी भी प्रकार से किसी अन्य के लिए जाने का रास्ता dynamic_cast है। लेकिन यह ऑब्जेक्ट को पॉलिमॉर्फिक होने की आवश्यकता है। इस सामान्य तौर पर एक वी-टेबल की आवश्यकता है A
और B
दोनों को संबद्ध किया जा सकता है, तो: अगर ए और बी कम से कम एक आभासी समारोह है, और RTTI को निष्क्रिय नहीं है,
A* pa1 = new C;
A* pa2 = new A;
B* pb1 = dynamic_cast<B*>(pa1);
B* pb2 = dynamic_cast<B*>(pa2);
को PB2 में परिणाम होगा शून्य और पीबी 1 ऑब्जेक्ट के बी भाग को इंगित करने के लिए * pa1 को इसके भाग के रूप में इंगित करें। (तथ्य यह है कि सी या उन दो अड्डों से जो कुछ भी व्युत्पन्न है, इससे कोई फर्क नहीं पड़ता)।
अन्यथा, जहां सभी जरूरतों को स्थिर होने के लिए आपको सी के माध्यम से जाना
B* pb = static_cast<B*>(static_cast<C*>(pa));
ध्यान दें कि static_cast<B*>(pA)
संकलन नहीं कर सकते, ए और बी एक दूसरे को असंबंधित किया जा रहा है।
धन्यवाद देखें। अप्रत्याशित व्यवहार वही है जो मेरे पास था) – Andrew
लेकिन मुझे पता नहीं लगा कि क्यों गतिशील_कास्ट ठीक हो गया – Andrew
@Andrew, 'dynamic_cast 'भी मान्य है और यह काम करेगा (बशर्ते कक्षाएं पॉलिमॉर्फिक हों); क्योंकि 'सी' वास्तव में' ए' का उप-वर्ग है। हालांकि, इस मामले में 'static_cast 'बेहतर विचार होगा क्योंकि यह संकलन समय पर होता है। –
iammilind