2010-12-28 20 views
5

इस एक उदाहरण प्रभावी सी ++ 3ed से लिया है, यह कहना है कि अगर static_cast इस तरह से प्रयोग किया जाता है, वस्तु के आधार हिस्सा नकल की जाती है , और उस भाग से कॉल का आह्वान किया जाता है। मैं समझना चाहता था कि हुड के नीचे क्या हो रहा है, क्या कोई मदद करेगा?प्रश्न

class Window {        // base class 
public: 
    virtual void onResize() { }     // base onResize impl 
}; 

class SpecialWindow: public Window {   // derived class 
public: 
    virtual void onResize() {     // derived onResize impl; 
    static_cast<Window>(*this).onResize(); // cast *this to Window, 
               // then call its onResize; 
               // this doesn't work! 
               // do SpecialWindow- 
    }           // specific stuff 
}; 
+2

मैं टिप्पणी होगा भी static_cast का उपयोग कर यह एक ही कर सकते हैं,, लेकिन आप इस तरह से करने के लिए है, चूंकि 'static_cast (* यह) 'एक प्रतिलिपि बनाता है, यह कोड सबसे अधिक संभावना है ** इच्छित परिणाम का उत्पादन नहीं **। – gatopeich

उत्तर

11

यह:

{ 
    Window w = *this; 
    w.onResize(); 
} // w.~Window() is called to destroy 'w' 

पहली पंक्ति this द्वारा की ओर इशारा किया SpecialWindow वस्तु की Window आधार वर्ग subobject एक कॉपी बन जाती:

static_cast<Window>(*this).onResize(); 

प्रभावी रूप से इस रूप में ही है । दूसरी पंक्ति उस प्रतिलिपि पर onResize() पर कॉल करती है।

यह महत्वपूर्ण है: this द्वारा ऑब्जेक्ट पर आप Window::onResize() पर कभी भी कॉल न करें; आप Window::onResize() को this की प्रतिलिपि पर कॉल करते हैं जिसे आपने बनाया था। this द्वारा ऑब्जेक्ट की प्रतिलिपि बनाने के बाद इसे स्पर्श नहीं किया जाता है।

आप, this द्वारा बताया करने के लिए वस्तु पर Window::onResize() कॉल करने के लिए चाहते हैं you can do so like this:

Window::onResize(); 
+1

नहीं, यह 'विंडो डब्ल्यू (* यह) जैसा ही है; '। – curiousguy

5

कास्टिंग क्यों? बस यह करने के लिए यदि आप विंडो के onResize(),

Window::onResize(); //self-explanatory! 

ठीक कॉल करना चाहते हैं, तो आप

static_cast<Window&>(*this).onResize(); 
    //note '&' here ^^ 
+0

यह सच होगा यदि ओपी ने उपयोग किया था: 'static_cast ' (उपर्युक्त उदाहरण में यहां और यहां की कमी)। –

+0

@ मार्टिन: इसे इंगित करने के लिए धन्यवाद। मैंने अपनी पोस्ट संपादित की है। – Nawaz

+1

मैं क्या कहने की कोशिश कर रहा था। क्या आपका पहला संस्करण ओपी के बराबर नहीं था। ऐसा इसलिए है क्योंकि ओपी संस्करण संदर्भ का उपयोग नहीं करता है और इस प्रकार (* यह) (कॉपी कन्स्ट्रक्टर का उपयोग करके) की एक प्रति बनाता है, फिर प्रतिलिपि() को ऑब्जेक्ट पर (वर्तमान ऑब्जेक्ट नहीं) पर कॉल करता है। –

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