2010-07-25 18 views
6

साथ कास्टिंग आप व्युत्पन्न वर्ग कि BaseA और BaseB दोनों से विरासत के लिए एक शून्य * सूचक है, तो कैसे संकलक जानते हुए भी कि void* सूचक प्रकार Derived की है बिना BaseA* (या BaseB*) को void* सूचक डाली है?एकाधिक वंशानुक्रम

उत्तर

5

ऐसा नहीं है। केवल गारंटी जब करने के लिए और एक void* से कास्टिंग एक static_cast उपयोग कर रहा है:

प्रकार सूचक का मान परिवर्तित वस्तु के लिए करने के लिए "cv void सूचक" और वापस मूल सूचक प्रकार के अपने मूल का मान (सी + +03 §5.2.9/10)।

struct B1 { int i; }; 
struct B2 { int j; }; 

struct D : B1, B2 { }; 

D x; 
B1* b1ptr = &x; 
void* voidptr = b1ptr; 
B2* b2ptr = static_cast<B2*>(voidptr); 

प्रयास कर रहा है:

उदाहरण के लिए, निम्नलिखित कोड गलत है क्योंकि void* एक प्रकार मूल सूचक प्रकार के अलावा अन्य करने के लिए डाला जाता है (- ->void*>B2* डाली अनुक्रम B1* है) b2ptr का उपयोग करने के लिए यहां अपरिभाषित व्यवहार होगा। एकमात्र प्रकार जिसे आप सुरक्षित रूप से voidptr पर B1* डाल सकते हैं, क्योंकि वह प्रकार है जिस प्रकार से void* प्राप्त किया गया था (ठीक है, या char*, क्योंकि char* के माध्यम से कुछ भी एक्सेस किया जा सकता है)।

3

कंपाइलर void* पॉइंटर को किसी भी चीज़ पर नहीं डाला - आप, प्रोग्रामर, करते हैं।

आदेश में एक void* सूचक के साथ कुछ भी उपयोगी करने के लिए, आप के लिए स्पष्ट गैर void* सूचक को यह कलाकारों की जरूरत है, और यदि आप क्या सूचक वास्तव में के लिए अंक टाइप के बारे में गलत कर रहे हैं, आप अपरिभाषित व्यवहार शहर डालें ।

+0

आपका उत्तर सही है। मेरे शोध से यदि व्युत्पन्न बेसए और बेसबी को बढ़ाता है, तो वस्तु को मेमोरी में रखा गया है | बेसए | बेसबी | व्युत्पन्न | इस प्रकार सूचक बेसबेस की शुरुआत की ओर इशारा कर रहा है इसलिए बेसबी को व्युत्पन्न कास्टिंग आपको बेसए के सदस्यों को पढ़ेगा। – Chazz

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