दिलचस्प पोस्ट
C ++ में डिफ़ॉल्ट पैरामीटर मान कहां रखा जाए? शुरुआती के लिए गिट: निश्चित व्यावहारिक गाइड सेलेनियम वेबड्रीवर में राइट-क्लिक मेनू से एक विकल्प चुनें – जावा डेटा विशेषता मान के आधार पर jquery सॉर्ट सूची कैसे __Contains__ ndarrays के लिए काम करता है? PHP में निर्देशिका आकार कैसे प्राप्त करें कैसे प्रक्रिया कांटा () के बीच स्मृति साझा करने के लिए? कैसे jQuery के साथ फ़ाइल इनपुट आकार की जांच करने के लिए? सॉफ्टवेयर फ्रेमवर्क क्या है? अजगर "के साथ" क्या डिज़ाइन किया गया है? jQuery को चेक बॉक्स के सरणी में मान मिलता है पकड़ी नहीं गई Syntax त्रुटि: अवांछित टोकन : matplotlib मेरे चित्र प्रदर्शित नहीं करता है हालांकि मैं pyplot.show () windowSoftInputMode = "समायोजित करें रीसाइज़ करें" पारभासी कार्य / नेविबार के साथ काम नहीं कर रहा है PHP के साथ JSON POST प्राप्त करें

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(); } 

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

Solutions Collecting From Web of "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 । आप एक रन-टाइम वेरिएबल के साथ संकलन-समय व्यवहार को प्रभावित करने का प्रयास कर रहे हैं, जो मौलिक रूप से असंभव है