संभव डुप्लिकेट:
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
मैं कहेंगे 'dynamic_cast' पसंद किया जा रहा है, लेकिन मैं कोई स्रोतों वापस करने के लिए है मेरी राय। – Constantinius
'गतिशील_कास्ट कुछ क्लाससीवर 'गैर-शून्य वापस लौटाएगा यदि' someClassCVar' 'ए' या 'ए' के किसी भी वंशज के लिए सूचक है। 'टाइपिड (someClassCVar) == टाइपिड (ए) 'केवल तभी सही है जब' someClassCVar' एक प्रकार है। तो आपके कोड के 2 टुकड़े बराबर नहीं हैं। – a1ex07
आमतौर पर यह एक डिज़ाइन गंध है यदि सी ++ प्रोग्राम को यह जानने की ज़रूरत है कि कौन सा बच्चा क्लाइंट पॉइंट पॉइंट इंगित करता है। आपको कम से कम 15 मिनट के लिए कदम उठाना चाहिए और अपने डिजाइन को देखना चाहिए। –