2011-09-15 29 views
12

कास्टिंग मान लेते हैं इस तरह के वर्ग पदानुक्रम है करते हैं?एकाधिक वंशानुक्रम आधार वर्ग से अलग व्युत्पन्न वर्ग

महत्वपूर्ण: मुझे लगता है मुझे लगता है कि वस्तु नहीं जानता कि सी मैं सिर्फ पता है कि यह इंटरफ़ेस बी को लागू करता है

उत्तर

9

नहीं। यह संभव नहीं है (A* से B* तक प्रत्यक्ष कास्टिंग)।

क्योंकि A और B का पता class C में विभिन्न स्थानों पर हैं। तो कलाकार हमेशा असुरक्षित रहेगा और संभवतः आप अप्रत्याशित व्यवहार में उतर सकते हैं। Demo

कास्टिंग हमेशा class C के माध्यम से जाना चाहिए। जैसे

A* pa = new C(); 
B* pb = static_cast<C*>(pa); 
        ^^^^ go through class C 

Demo

+0

धन्यवाद देखें। अप्रत्याशित व्यवहार वही है जो मेरे पास था) – Andrew

+0

लेकिन मुझे पता नहीं लगा कि क्यों गतिशील_कास्ट ठीक हो गया – Andrew

+0

@Andrew, 'dynamic_cast 'भी मान्य है और यह काम करेगा (बशर्ते कक्षाएं पॉलिमॉर्फिक हों); क्योंकि 'सी' वास्तव में' ए' का उप-वर्ग है। हालांकि, इस मामले में 'static_cast 'बेहतर विचार होगा क्योंकि यह संकलन समय पर होता है। – iammilind

2

हाँ, आप पहली बार static_cast सी * करने के लिए वस्तु है, तो आप इसे फिर से करने के लिए कर सकते हैं static_cast चाहिए बी (हालांकि इस अंतिम कलाकार की आवश्यकता नहीं है, क्योंकि एक मानक रूपांतरण है)। मुझे यकीन नहीं है कि static_cast आईएनजी ऑब्जेक्ट सीधे बी पर काम करेगा, कोशिश करें और देखें कि क्या आपको कंपाइलर त्रुटियां मिलती हैं। बी 0 पर reinterpret_cast आईएनजी ऑब्जेक्ट आपको रनटाइम क्रैश मिलेगा, क्योंकि ए और बी के अलग-अलग पते होंगे यदि वे दोनों खाली नहीं हैं।

संपादित करें प्रश्न बदलने के बाद, अब आप जो करना चाहते हैं वह करना संभव नहीं है। आपको विरासत के पेड़ को ऊपर और नीचे सही पथ जानने की जरूरत है, क्योंकि गैर-खाली कक्षाओं के साथ कई विरासत वाले परिदृश्य में कास्टिंग सूचक में बदलाव का तात्पर्य है।

+0

कृपया मेरा संपादन (महत्वपूर्ण) – Andrew

0

जब तक ऑब्जेक्ट बी से प्राप्त होता है, तब तक आप ऑब्जेक्ट को हमेशा बी पर डाल सकते हैं। और निश्चित रूप से, आप केवल इंटरफ़ेस बी में परिभाषित विधियों को कॉल कर सकते हैं, क्योंकि वर्चुअल पॉइंटर केवल बी द्वारा परिभाषित विधि तक पहुंच सकता है आभासी तालिका में।

8

किसी भी प्रकार से किसी अन्य के लिए जाने का रास्ता 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) संकलन नहीं कर सकते, ए और बी एक दूसरे को असंबंधित किया जा रहा है।

संबंधित मुद्दे