2015-12-14 18 views
11

पर किस प्रकार का कास्ट होता है (B::get() में)?कास्ट व्युत्पन्न वर्ग को

class A { 
public: 
    A() : a(0) {} 
    int a; 
}; 

class B : public A { 
public: 
    A* get() { 
     return this; //is this C-style cast? 
    } 
}; 

int main() 
{ 
    B b; 
    cout << b.get()->a << "\n"; 

    system("pause"); 
    return 0; 
} 

मैंने इस तरह के कोड को एक प्रसिद्ध एपीआई में देखा है। static_cast<A*>(this); करने के लिए यह बेहतर अभ्यास है?

+8

कोई कास्टिंग नहीं है, केवल एक निहित रूपांतरण है। एक कलाकार एक स्पष्ट रूपांतरण है। – molbdnilo

उत्तर

9

यह एक मानक व्युत्पन्न-टू-बेस पॉइंटर रूपांतरण है। नियम है कि कुछ const/volatile योग्यता के साथ D के लिए सूचक ही क्वालिफायर के साथ B के लिए सूचक में बदला जा सकता है, तो BD का एक आधार वर्ग है।

मानक रूपांतरण जैसे static_cast या सी शैली डाले बातें करने के लिए निर्मित कर रहे हैं अर्थ और अलग अवधारणाओं के साथ अंतर्निहित रूपांतरण कर रहे हैं।

आम तौर पर जब आप कर सकते हैं तो निहित रूपांतरणों पर भरोसा करना सबसे अच्छा है। स्पष्ट रूपांतरण अधिक कोड शोर जोड़ते हैं और कुछ रखरखाव गलतियों को छुपा सकते हैं।

+0

कड़ाई से, "एक * या अधिक * क्वालीफायर" –

+2

के साथ एक सूचक में 'बी' में परिवर्तित किया जा सकता है, मैं सुझाव देता हूं कि विशेष रूप से उनके प्रश्न का उत्तर दें: "नहीं,' static_cast' का उपयोग करना बेहतर नहीं है - वास्तव में, यह है खराब अभ्यास। अगर आपको उनकी जरूरत नहीं है तो हमेशा से बचें। " –

+0

@ मार्टिनबोनर असहमत! नकली बग सभी प्रकार के निराला बग का स्रोत हैं। कभी-कभी मैं चाहता हूं कि सी ++ ने उन्हें बिल्कुल भी नहीं दिया ... स्पष्ट होने में कुछ भी गलत नहीं है। – Barry

3

यह पूर्वजों के लिए निहित रूपांतरण है। लागू रूपांतरण आम तौर पर सुरक्षित होते हैं और वे static_cast सामग्री नहीं कर सकते हैं। वे वास्तव में और भी प्रतिबंधित हैं: आप static_cast के साथ एक अनचेक डाउनकास्ट कर सकते हैं, लेकिन अंतर्निहित रूपांतरण के साथ नहीं।

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