2013-03-06 10 views
8

मैंने शीर्षक में अपने मुख्य प्रश्न से पूछा। मैं इसे दोहराना नहीं चाहता हूं। (सूखी: डी)सी ++ में अमूर्त वर्ग और शुद्ध अमूर्त वर्ग के बीच क्या अंतर है?

संपादित करें: उदाहरण:

Iterators शुद्ध कपोल-कल्पना कर रहे हैं: कुछ भी व्यवहार करती है कि एक इटरेटर की तरह एक इटरेटर है।

इसका क्या अर्थ है?

+6

मुझे नहीं लगता कि सी ++ इस तरह का एक भेद बनाता है। कुछ उपयोगकर्ता इसे कर सकते हैं यदि यह कुछ संदर्भ में महत्वपूर्ण है, लेकिन यह अक्सर नहीं होता है। यदि ऐसा है, तो आपको उन उपयोगकर्ताओं से पूछना चाहिए कि उनका क्या मतलब है। –

+1

आपने इन शर्तों को कहाँ सुना? उनसे पूछों! – Nawaz

+0

[शुद्ध अमूर्त वर्ग और इंटरफेस] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/2091893/pure-abstract-class-and-interface) – unwind

उत्तर

23

एक अमूर्त वर्ग में कम से कम एक शुद्ध वर्चुअल फ़ंक्शन है। यह मानक सी ++ शब्दावली है।

कुछ लोग इस श्रेणी का वर्णन करने के लिए शुद्ध अमूर्त वर्ग शब्द का उपयोग करते हैं जिसमें शुद्ध वर्चुअल फ़ंक्शंस (दूसरे शब्दों में, कोई डेटा सदस्य और कोई ठोस कार्य नहीं है) का वर्णन करने के लिए कुछ भी नहीं है। यह जावा इंटरफेस के बराबर है।

अब अपने वास्तविक सवाल का: कुछ भी बर्ताव करता है कि पुनरावर्तक की तरह एक इटरेटर है:

Iterators शुद्ध कपोल-कल्पना कर रहे हैं।

इसका सार सारणी (शुद्ध या अन्यथा) से कोई लेना देना नहीं है। यह सब कह रहा है कि इटेटरेटर अनुबंध को पूरा करने वाला कुछ भी एक इटरेटर है। इसे कक्षा (विचार पॉइंटर्स) भी नहीं होना चाहिए।

4

मुझे लगता है कि शुद्ध सार वर्ग एक इंटरफेस के सी ++ समतुल्य है।

here देखें:

एक शुद्ध सार वर्ग केवल सार सदस्य कार्य करता है और कोई डेटा या कंक्रीट सदस्य कार्य करती है। आम तौर पर, एक शुद्ध अमूर्त वर्ग एक इंटरफ़ेस को परिभाषित करने के लिए उपयोग किया जाता है और इसका उद्देश्य कंक्रीट कक्षाओं द्वारा विरासत में प्राप्त किया जाना है। यह कक्षा डिजाइनर और उस वर्ग के उपयोगकर्ताओं के बीच अनुबंध को मजबूर करने का एक तरीका है। इस कक्षा के उपयोगकर्ताओं को संकल्प के लिए कक्षा के लिए मिलान करने वाले सदस्य फ़ंक्शन को घोषित करना होगा।

14

कुछ भी नहीं। सी ++ मानक केवल यह बताता है कि ए), एक वर्ग सार है यदि उसके पास कम से कम एक शुद्ध वर्चुअल फ़ंक्शन, प्रत्यक्ष या विरासत है, और बी), आप सीधे एक अमूर्त वर्ग को तुरंत चालू नहीं कर सकते हैं। शुद्ध अमूर्त वर्ग जैसी कोई चीज़ नहीं है।

+7

यह आधिकारिक तौर पर मामला हो सकता है, लेकिन यह निश्चित रूप से सामान्य उपयोग में एक शब्द है। –

5

एक अमूर्त वर्ग कुछ कार्यक्षमता वाला वर्ग है लेकिन कुछ को लागू करने की आवश्यकता है, जबकि शुद्ध सार वर्ग में इसकी कोई भी कार्यक्षमता लागू नहीं होती है।

यह सी # और जावा जैसी अन्य भाषाओं में एक इंटरफेस की तरह थोड़ा सा है।

एक शुद्ध अमूर्त वर्ग 'अनुबंध' निर्दिष्ट करने के उद्देश्य को पूरा करेगा जो शुद्ध अमूर्त वर्ग के विवेकाधिकारों का पालन करना चाहिए।

0

सी ++ में शुद्ध अमूर्त वर्ग नहीं है। केवल अमूर्त वर्ग और शुद्ध वर्चुअल फ़ंक्शन हैं (फ़ंक्शन को 0 के साथ चिह्नित किया गया है)। कम से कम एक शुद्ध वर्चुअल फ़ंक्शन वाला वर्ग सार बन जाता है। हालांकि शुद्ध वर्चुअल फ़ंक्शन में कार्यान्वयन हो सकता है।

+0

जिस तरह से आप यह कहते हैं वह भ्रम पैदा कर रहा है। सी ++ में, "सार" एक कीवर्ड नहीं है, न तो "शुद्ध" है। जैसा कि आपने कहा था, "= 0" के साथ चिह्नित वर्चुअल फ़ंक्शंस को "शुद्ध वर्चुअल फ़ंक्शंस" कहा जाता है, जो "अवधारणाओं" के समान अवधारणा के लिए एक और शब्द है। जब एक वर्ग * केवल * शुद्ध/अमूर्त कार्य करता है, तो इसे "शुद्ध अमूर्त वर्ग" के रूप में संदर्भित करने के लिए सामान्य शब्दावली है, हालांकि पूरे वर्ग को स्पष्ट रूप से चिह्नित करने के लिए सी ++ में कोई विशेष वाक्यविन्यास नहीं है। जैसे ही आप इस तरह के वर्ग में शुद्ध/अमूर्त कार्यों से कुछ और जोड़ते हैं, यह अब "शुद्ध सार" नहीं है, लेकिन यह अभी भी "सार" है। –

+0

क्षमा करें, आपकी शब्दावली सी ++ मानक को पूरा नहीं करती है। लेकिन यहां हम सी ++ प्रश्न पर चर्चा कर रहे हैं। – AnatolyS

+0

ऐसा इसलिए नहीं है क्योंकि मानक में एक शब्द का उपयोग नहीं किया जाता है जो अस्तित्व में नहीं है। यह पूरे ओओ शब्दावली को कवर करने के मानक का लक्ष्य नहीं है, या विभिन्न मुहावरे लोग सी ++ में उपयोग करने आए हैं। कक्षा में "शुद्ध" शब्द को लागू करना पूरी तरह से कानूनी है। शायद हम कह सकते हैं कि शुद्ध और गैर शुद्ध शुद्ध आधार वर्ग के बीच सी ++ में कोई तकनीकी अंतर नहीं है? –

1

सार कक्षा * कम से कम एक शुद्ध वर्चुअल फ़ंक्शन होगा और इसमें डेटा सदस्य हो सकते हैं।

शुद्ध सार कक्षासिर्फ एकइंटरफ़ेस की तरह है। केवल शुद्ध आभासी कार्यों को परिभाषित किया जा सकता है। यहां कोई डेटा सदस्य या विधि परिभाषा नहीं की जा सकती है।

अधिक जानकारी के लिए: (https://en.wikibooks.org/wiki/C%2B%2B_Programming/Classes/Abstract_Classes/Pure_Abstract_Classes)

0

अपने उदाहरण में, आप के बारे में Iterators बात कर रहे हैं। सी ++ में, और अधिक विशेष रूप से मानक लाइब्रेरी में, शब्द Iterators शुद्ध सार वर्ग का संदर्भ नहीं देता है, लेकिन अवधारणाओं को कहा जाता है। अवधारणाओं का उपयोग वर्चुअल/विरासत-आधारित पॉलीमोर्फिज्म के बजाय टेम्पलेट्स के साथ किया जाता है। वर्तमान में (सी ++ 11), अवधारणाओं को केवल लाइब्रेरी दस्तावेज में परिभाषित किया गया है, यानी वे सी ++ भाषा के हिस्से के रूप में मौजूद नहीं हैं (अभी तक)। मानक लाइब्रेरी दस्तावेज अवधारणाओं, उदाहरण के लिए "इटरेटर" अवधारणा, आवश्यकताओं के सेट के रूप में किसी भी प्रकार/ऑब्जेक्ट को टेम्पलेट के प्रकार पैरामीटर के रूप में स्वीकार किया जाना चाहिए जो "इटरेटर" के साथ काम करना चाहता है। आवश्यकताओं का एक सेट परिभाषित किया गया है कि किस प्रकार के अभिव्यक्ति किसी वस्तु पर मान्य हैं, इसके बावजूद। यह बतख-टाइपिंग का एक रूप है। उदाहरण के लिए, देखें: http://en.cppreference.com/w/cpp/concept/Iterator

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