2015-11-05 6 views
6

मैं पुस्तक "ए टूर ऑफ़ सी ++" पढ़ रहा हूं, और निम्नलिखित पैराग्राफ को समझ नहीं पा रहा हूं। "एक अलग प्रकार अस्वीकार्य" का क्या अर्थ है? तो, पॉइंटर कास्टिंग का उपयोग कब करें और संदर्भ कास्टिंग का उपयोग कब करें? क्या कोई इसे विस्तारित कर सकता है? धन्यवाद।संदर्भ के गतिशील_कास्ट का उपयोग कब करें?

संपादित करें: अन्य प्रश्न, "Difference in behavior while using dynamic_cast with reference and pointers" गतिशील_कास्ट के व्यवहार से पूछ रहा है, जिसे मैं समझ सकता हूं - वापसी नलप्टर या अपवाद फेंक दें। इस सवाल में, मैं पूछ रहा हूं कि कब उपयोग करें और दूसरे का उपयोग कब करें।

"हम एक सूचक प्रकार जब एक अलग व्युत्पन्न वर्ग की एक वस्तु के लिए सूचक एक वैध तर्क है dynamic_cast का उपयोग करें। इसके बाद हम परीक्षण करते हैं कि परिणाम nullptr है। यह परीक्षण अक्सर आसानी में रखा जा सकता एक स्थिति में एक चर के प्रारंभिकरण। जब एक अलग प्रकार अस्वीकार्य है, तो हम केवल संदर्भ प्रकार में गतिशील_कास्ट कर सकते हैं। यदि ऑब्जेक्ट अपेक्षित प्रकार का नहीं है, तो खराब_कास्ट फेंक दिया गया है: " - सी ++ का एक दौरा , धारा 4.5.3

उत्तर

11

असल में अगर हमारे वस्तु विभिन्न प्रकार के होने की अनुमति दी है, हम dynamic_cast एक सूचक ताकि हम जांच कर सकते हैं कर सकते हैं अगर डाली सफल रहा:

void do_if_derived(Base& b) { 
    Derived* d = dynamic_cast<Derived*>(&b); 
    if (d) { 
     // do something 
    } 
    else { 
     // not a Derived, this is OK 
    } 
} 

लेकिन अगर हमारे वस्तु एक भी विशिष्ट प्रकार हो गया है, हम एक संदर्भ के लिए dynamic_cast और कलाकारों फेंक दे सकते हैं अगर यह गलत होता है:

void this_better_be_a_derived(Base& b) 
{ 
    Derived& d = dynamic_cast<Derived&>(b); 
    // do stuff with d 
    // will throw if, e.g. b is a DifferentDerived& instead 
} 

यह एक शाखा के माध्यम से या एक अपवाद के माध्यम से विफलता मामले को संभालने के लिए इच्छुक की बात है।

5

"अस्वीकार्य" का अर्थ है "यहां स्वीकार नहीं किया जा सकता"। विशेष रूप से, अपने कोड से।

आप dynamic_cast<T*>(e) का उपयोग अपने स्वयं के कोड मामला संभाल कर सकते हैं, तो जहां *e, प्रकार T की नहीं है रूपांतरण के परिणाम की जाँच और कुछ और कर यदि रूपांतरण विफल रहा द्वारा कर सकते हैं।

आप dynamic_cast<T&>(e) का उपयोग कर सकते हैं यदि eT प्रकार का नहीं है तो अपने कोड का निष्पादन अर्थपूर्ण रूप से जारी नहीं हो सकता है।

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