2012-03-14 12 views
16

संभव डुप्लिकेट:
C++ equivalent of instanceofसी ++ dynamic_cast typeid बनाम

मैं सोच रहा था क्या dynamic_cast और typeid सिर्फ वर्ग तुलना के संबंध में है के बीच का अंतर (से गतिशील_कास्ट उप-वर्ग के तरीकों तक पहुंचने की अनुमति और प्रकार आईडी केवल कक्षा तुलना के लिए उपयोगी है)। मुझे एक दो साल का स्टैक ओवरफ्लो मिला जो एक ही प्रश्न पूछता है: C++ equivalent of instanceof। हालांकि, यह दो साल का है और मैं एक पुरानी पोस्ट को नेक्रो नहीं करना चाहता था (और मुझे यकीन है कि टाइपिड बाहर आया), इसलिए मैंने एक ही प्रश्न को थोड़ा अंतर के साथ फिर से पूछने का विचार किया।

असल में, मेरे पास कक्षा ए और कक्षा बी है, जो अमूर्त कक्षा सी के उप-वर्ग हैं। कक्षा सी को विधि के पैरामीटर के रूप में लिया जा रहा है और मैं यह निर्धारित करना चाहता हूं कि कक्षा सी वास्तव में कक्षा ए या कक्षा बी है या नहीं। टाइपिड और गतिशील_कास्ट ठीक से काम करता है, इसलिए यह सर्वोत्तम अभ्यास/प्रदर्शन का एक प्रश्न है। मैं अनुमान लगा रहा हूँ:

A* test = dynamic_cast<A*> someClassCVar 
if (test != 0) { //it is of class A } 

या

if (typeid(someClassCVar) == typeid(A)) { 
    //it is of class A 
} 

संपादित करें: क्षमा करें, मैं जानकारी के इस बिट शामिल करने के लिए भूल गया था। ActiveMQ CMS दस्तावेज़ गतिशील_कास्ट का उपयोग करने के लिए कहता है, लेकिन मुझे लगता है कि यह केवल इसलिए है क्योंकि यह मानता है कि उपयोगकर्ता subclass के लिए विशिष्ट विधियों तक पहुंच बनाना चाहता है। मेरे लिए, ऐसा लगता है कि typeid बेहतर प्रदर्शन हो सकता है अगर केवल एक वर्ग तुलना की जरूरत है: http://activemq.apache.org/cms/cms-api-overview.html

+1

मैं कहेंगे 'dynamic_cast' पसंद किया जा रहा है, लेकिन मैं कोई स्रोतों वापस करने के लिए है मेरी राय। – Constantinius

+3

'गतिशील_कास्ट कुछ क्लाससीवर 'गैर-शून्य वापस लौटाएगा यदि' someClassCVar' 'ए' या 'ए' के ​​किसी भी वंशज के लिए सूचक है। 'टाइपिड (someClassCVar) == टाइपिड (ए) 'केवल तभी सही है जब' someClassCVar' एक प्रकार है। तो आपके कोड के 2 टुकड़े बराबर नहीं हैं। – a1ex07

+3

आमतौर पर यह एक डिज़ाइन गंध है यदि सी ++ प्रोग्राम को यह जानने की ज़रूरत है कि कौन सा बच्चा क्लाइंट पॉइंट पॉइंट इंगित करता है। आपको कम से कम 15 मिनट के लिए कदम उठाना चाहिए और अपने डिजाइन को देखना चाहिए। –

उत्तर

25

दो तरीकों के बीच एक महत्वपूर्ण अंतर है

if(typeid(someClassCVar) == typeid(A)) { 
    // someClassCVar is of class A, not a derived class 
} 
+0

आह के लिए गैर वर्चुअल बेस क्लास है, तो मैं देखता हूं। तो अगर हमें कोई परवाह नहीं है कि यह ए या किसी कारण के लिए ए के उप-वर्ग है, तो बेहतर होगा? – Jon

+2

@ जोन: जाहिर है पहला;; – Constantinius

+1

'dynamic_cast <> 'तब, क्योंकि आप केवल' ए 'के इंटरफ़ेस में रूचि रखते हैं और इस पर ध्यान नहीं देते कि यह कैसे कार्यान्वित किया जाता है। –

0

यह निर्भर करता है कि पोस्ट प्रकार पहचान प्रसंस्करण एक पर है या नहीं एक सूचक की जरूरत है।

चेकिंग टाइपिड निश्चित रूप से तेज़ होगा (क्योंकि वे कंपाइलर निरंतर पहचानकर्ता उत्पन्न होते हैं) लेकिन किसी ए इंस्टेंस को मैनिपुलेट करने के लिए प्रदान नहीं करेंगे, इसलिए आपको ए इंस्टेंस प्राप्त करने के लिए गतिशील_कास्ट करने के लिए बाध्य किया जाएगा।

if(A* test = dynamic_cast<A*>(&someClassCVar)) { 
    // someClassCVar is A or publicly derived from A 
} 

जबकि:

+4

... या static_cast अगर सी ए और बी – user396672

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