दिलचस्प पोस्ट
कंडीशनर त्रुटि जब अंदर एक चर की घोषणा करते हैं तो कंडीशन और कोई कर्ली ब्रेसिज़ नहीं एक विभाजन गलती क्या है? सरल एक्सएमएल फ़ाइल से डेटा का निष्कर्षण मैं सी # के साथ वेब कैमरा वीडियो कैसे स्ट्रीम कर सकता हूं? स्विफ्ट से सी एपीआई के साथ कार्य करना मैं पर्ल में एक प्रक्रिया को कैसे भूल सकता हूं और भूल सकता हूं? बहु प्रसंस्करण: प्रक्रियाओं के बीच एक बड़े पढ़ने-योग्य ऑब्जेक्ट साझा करना? jQuery के मान्य – छिपे हुए क्षेत्रों के लिए सत्यापन सक्षम करें कर्सर एडेप्टर और SQLite उदाहरण DoCmd.SetWarnings और CurrentDB.Execute के बीच अंतर क्या है मैं न्यूलाइंस या रिक्त स्थान जोड़ने से कैसे पायथन प्रिंट रखूं? अपने बच्चों को पुनः बनाने से TabControl रोकें रिबूट के बाद एंड्रॉइड अलार्म मैनेजर जीकग्रीड में कॉलम मूल्य से जीएटी का उपयोग करते हुए एक नए पेज पर लिंक करना क्लिक करने पर छवि फ़ाइलों को डाउनलोड करने के लिए ब्राउज़र को बल दें

C ++ में 'static_cast' का उपयोग करके डाउनकास्टिंग

विचार करें:

class base { base(); virtual void func(); } class derived : public base { derived(); void func(); void func_d(); int a; } main { base *b = new base(); sizeof(*b); // Gives 4. derived * d = static_cast<derived*>(b); sizeof(*d); // Gives 8- means whole derived obj size..why? d->func_d(); } 

उपरोक्त कोड में मैंने एक बेस पॉइंटर के डाउनकास्टिंग किया जो कि आधार वस्तु को व्युत्पन्न क्लास पॉइंटर को इंगित करता है। मैं सोच रहा हूं कि कैसे व्युत्पन्न सूचक पूरी व्युत्पन्न वर्ग ऑब्जेक्ट है। मैं व्युत्पन्न क्लास फ़ंक्शन (केवल व्युत्पन्न वर्ग में घोषित) कॉल कर सकता हूं। मुझे अवधारणा यहाँ नहीं मिली।

वेब के समाधान से एकत्रित समाधान "C ++ में 'static_cast' का उपयोग करके डाउनकास्टिंग"

ऑब्जेक्ट को एक प्रकार के डालने के लिए static_cast का उपयोग करना, यह वास्तव में उपज नहीं है, अपरिभाषित व्यवहार यूबी के लक्षण व्यापक रूप से भिन्न होते हैं ऐसा कुछ भी नहीं है जो कहता है कि यूबी व्युत्पन्न सदस्य कार्य को सफलतापूर्वक बुलाया नहीं जा सकता है (लेकिन ऐसा कुछ भी नहीं है जो गारंटी देगा कि ऐसा होगा, इसलिए इस पर भरोसा न करें)।

यहां [expr.static.cast] का उपयोग करने वाले डाउनकास्टिंग के नियम, सी ++ मानक (सी ++ 0x [expr.static.cast] ) के खंड 5.2.9 ( [expr.static.cast] ) में पाया गया है:

"पॉइंटर टू सीवी 1 B " का एक प्राइव , जहां B एक क्लास प्रकार होता है, को "पॉइंटर टू सीवी 2 D " के एक प्राइव्यू में परिवर्तित किया जा सकता है, जहां D B से प्राप्त एक क्लास है, अगर "पॉइंटर" से एक वैध मानक रूपांतरण D "से" B टू पॉइंटर B "में मौजूद है, सीवी 2 एक ही सीवी-योग्यता है, या सीवी 1 की तुलना में अधिक सीवी-योग्यता है, और B न तो वर्चुअल बेस क्लास है और न ही वर्चुअल बेस क्लास का आधार वर्ग । शून्य सूचक मूल्य गंतव्य प्रकार के शून्य सूचक मूल्य में कनवर्ट किया जाता है। यदि टाइप "पॉइंटर टू सीवी 1 B " का प्राइव्यू B को इंगित करता है जो कि वास्तव में प्रकार D ऑब्जेक्ट का एक सबोबैक्ट होता है, जिसके परिणामस्वरूप पॉइंटर अंक D के संलग्न ऑब्जेक्ट को इंगित करता है। अन्यथा, कलाकारों के परिणाम अनिर्धारित हैं।

रनटाइम चेकिंग करने वाला एकमात्र कलाकार dynamic_cast<>() । यदि कोई संभावना है कि एक कलाकार रनटाइम पर काम नहीं करेगा तो इस कास्ट का इस्तेमाल किया जाना चाहिए।

इस प्रकार पत्ती से कास्टिंग-> रूट (ऊपर कास्टिंग) static_cast<>() ठीक काम करता है
लेकिन रूट-> पत्ती (कास्टिंग का नीचे) से कास्टिंग खतरनाक है और (मेरी राय में) dynamic_cast<>() साथ हमेशा किया जाना चाहिए क्योंकि रन-टाइम जानकारी पर निर्भरताएं होंगी। लागत मामूली है, लेकिन हमेशा सुरक्षा के लिए भुगतान करने के लायक है

sizeof संकलन-समय पर मौजूद है यह न तो जानता है और न ही परवाह करता है कि रन-टाइम में, आपका बेस ऑब्जेक्ट किसी derived व्यक्ति से बात नहीं करता derived । आप एक रन-टाइम वेरिएबल के साथ संकलन-समय व्यवहार को प्रभावित करने का प्रयास कर रहे हैं, जो मौलिक रूप से असंभव है