वर्चुअल और प्योर वर्चुअल फंक्शन के बीच अंतर
विषय
- तुलना चार्ट
- वर्चुअल फंक्शन की परिभाषा
- घोषणा:
- बहुस्तरीय विरासत
- शुद्ध आभासी फ़ंक्शन की परिभाषा
- सार वर्ग
- निष्कर्ष:
वर्चुअल फ़ंक्शन और शुद्ध वर्चुअल फ़ंक्शन दोनों रन टाइम पॉलीमॉर्फिज़्म की अवधारणाएं हैं। ‘के बीच मुख्य अंतरआभासी फ़ंक्शन ' तथा ‘शुद्ध आभासी कार्य ' यह है कि 'वर्चुअल फंक्शन' की परिभाषा बेस क्लास में है और इनहेरिट की गई व्युत्पन्न कक्षाएं भी इसे फिर से परिभाषित करती हैं। शुद्ध आभासी फ़ंक्शन की बेस क्लास में कोई परिभाषा नहीं है, और सभी अंतर्निहित व्युत्पन्न वर्गों को इसे फिर से परिभाषित करना है।
हालाँकि, वर्चुअल फ़ंक्शन को डायनेमिक प्रेषण और रन-टाइम डिस्पैच के रूप में भी कहा जाता है, जिसे फ़ंक्शन के कारण उपयोग किए गए ऑब्जेक्ट के प्रकार के अनुसार रन टाइम में निर्दिष्ट किया जाता है।
बहुरूपता दोनों भाषाओं C ++ और जावा द्वारा समर्थित है। जावा में, "ओवरराइडिंग" शब्द का उपयोग 'वर्चुअल फ़ंक्शन' के बजाय किया जाता है, क्योंकि वर्चुअल फ़ंक्शन C ++ का शब्द है।
- तुलना चार्ट
- परिभाषा
- मुख्य अंतर
- निष्कर्ष
तुलना चार्ट
तुलना के लिए आधार | वर्चुअल फंक्शन | शुद्ध आभासी कार्य |
---|---|---|
बुनियादी | वर्चुअल फ़ंक्शन का आधार वर्ग में उनकी परिभाषा है। | बेस क्लास में प्योर वर्चुअल फंक्शन की कोई परिभाषा नहीं है। |
घोषणा | वर्चुअल फंक्शनल_नाम (पैरामीटर_लिस्ट) {। । । । ।}; | वर्चुअल फंक्शनल_नाम (पैरामीटर_लिस्ट) = 0; |
व्युत्पन्न वर्ग | सभी व्युत्पन्न वर्ग बेस क्लास के वर्चुअल फ़ंक्शन को ओवरराइड कर सकते हैं या नहीं भी कर सकते हैं। | सभी व्युत्पन्न वर्गों को आधार वर्ग के आभासी कार्य को ओवरराइड करना चाहिए। |
प्रभाव | आभासी कार्य प्रकृति में श्रेणीबद्ध हैं; यदि कोई व्युत्पन्न वर्ग आधार वर्ग के आभासी कार्य को ओवरराइड नहीं करता है तो यह संकलन को प्रभावित नहीं करता है। | यदि सभी व्युत्पन्न वर्ग बेस क्लास के वर्चुअल फ़ंक्शन को ओवरराइड करने में विफल होते हैं, तो संकलन त्रुटि उत्पन्न होगी। |
सार वर्ग | कोई अवधारणा नहीं। | यदि किसी वर्ग में कम से कम एक शुद्ध आभासी फ़ंक्शन होता है, तो उसे सार घोषित किया जाता है। |
वर्चुअल फंक्शन की परिभाषा
आभासी समारोह आधार वर्ग का सदस्य कार्य है, और इसे व्युत्पन्न वर्गों द्वारा पुनर्परिभाषित किया जाता है जो आधार वर्ग को विरासत में मिला है। यह आवश्यक नहीं है कि सभी अंतर्निहित व्युत्पन्न वर्गों को आभासी फ़ंक्शन को फिर से परिभाषित करना चाहिए, यह केवल उन व्युत्पन्न वर्गों द्वारा पुनर्परिभाषित किया जाता है जिन्हें इसके कामकाज की आवश्यकता हो सकती है। कीवर्ड के साथ पूर्ववर्ती बेस क्लास में फ़ंक्शन को घोषित करके एक वर्चुअल फ़ंक्शन बनाया जाता है 'आभासी'.
घोषणा:
क्लास बेस {पब्लिक: वर्चुअल टाइप funt_name (पैरामीटर-लिस्ट) {। । । }};
वंशानुगत व्युत्पन्न वर्ग वर्चुअल फ़ंक्शन को बिना किसी 'वर्चुअल' कीवर्ड के पुनर्परिभाषित कर सकते हैं। व्युत्पन्न कक्षाएं अपने कार्य को पूरा करने के लिए आभासी फ़ंक्शन को फिर से परिभाषित करती हैं। जैसा कि वर्चुअल फ़ंक्शन को व्युत्पन्न वर्गों में पुनर्परिभाषित किया जाता है, हमारे पास एक ही फ़ंक्शन के कई रूप हैं। अब, फ़ंक्शन के किस संस्करण को बुलाया जा रहा है, यह निर्भर करता है कि उस फ़ंक्शन को लागू करने के लिए किस प्रकार की वस्तु को संदर्भित किया जाता है।
बहुस्तरीय विरासत
बहुस्तरीय विरासत में, जहां एक व्युत्पन्न वर्ग जो अपने बेस क्लास से आभासी फ़ंक्शन को विरासत में मिला है, जब खुद को दूसरे व्युत्पन्न वर्ग के लिए बेस क्लास के रूप में उपयोग किया जाता है, तब भी वर्चुअल फ़ंक्शन को ओवरराइड किया जा सकता है। इसलिए, जब किसी वर्चुअल फंक्शन को विरासत में मिला जाता है, तो उसकी वर्चुअल प्रकृति भी विरासत में मिलती है।
वर्चुअल फ़ंक्शंस प्रकृति में भी पदानुक्रमित हैं, यानी यदि एक व्युत्पन्न वर्ग बेस क्लास से विरासत में प्राप्त वर्चुअल फ़ंक्शन को ओवरराइड / रीडिफ़ाइन नहीं करता है और जब व्युत्पन्न वर्ग की वस्तु उस वर्चुअल फ़ंक्शन को आमंत्रित करती है, तो बेस क्लास द्वारा परिभाषित वर्चुअल फ़ंक्शन को लागू किया जाता है।
शुद्ध आभासी फ़ंक्शन की परिभाषा
जैसा कि ऊपर देखा गया है यदि व्युत्पन्न वर्ग वर्चुअल फ़ंक्शन को ओवरराइड नहीं करता है तो बेस क्लास द्वारा परिभाषित वर्चुअल फ़ंक्शन का उपयोग किया जाता है। लेकिन, क्या होगा यदि आधार वर्ग ही वर्चुअल फ़ंक्शन को परिभाषित नहीं करता है। कई बार, बेस क्लास में वर्चुअल फ़ंक्शन के लिए कोई परिभाषा नहीं होती है, या कभी-कभी आप चाहते हैं कि सभी व्युत्पन्न वर्ग वर्चुअल फ़ंक्शन को ओवरराइड करें।
उपरोक्त दो स्थितियों को संभालने के लिए, C ++ “की अवधारणा का समर्थन करता हैशुद्ध आभासी कार्य"। एक 'शुद्ध आभासी फ़ंक्शन' को बेस क्लास में घोषित किया गया है, लेकिन बेस क्लास में इसकी परिभाषा नहीं है। शुद्ध वर्चुअल फ़ंक्शन निम्नानुसार घोषित किया गया है।
आभासी प्रकार functional_name (पैरामीटर_लिस्ट) = 0;
जब भी बेस क्लास में एक वर्चुअल फ़ंक्शन को "शुद्ध" बनाया जाता है, तो प्रत्येक व्युत्पन्न वर्ग को अनिवार्य रूप से बेस क्लास के शुद्ध वर्चुअल फ़ंक्शन को ओवरराइड करना चाहिए। यदि व्युत्पन्न वर्ग बेस क्लास के शुद्ध आभासी फ़ंक्शन को ओवरराइड करने में विफल रहता है, तो इसका परिणाम संकलन त्रुटि होगा।
सार वर्ग
जिस वर्ग में कम से कम एक शुद्ध कार्य होता है, उसे 'सार वर्ग' कहा जाता है। अमूर्त कक्षाओं की कोई भी वस्तु नहीं बनाई जा सकती है, लेकिन आप अमूर्त कक्षाओं के संदर्भ और संकेत बना सकते हैं। अमूर्त वर्गों के सदस्यों को व्युत्पन्न वर्ग के ऑब्जेक्ट के माध्यम से पहुँचा जा सकता है जो कि सार आधार वर्ग को विरासत में मिला है।
एक वर्ग जिसे आप सार घोषित करना चाहते हैं, कीवर्ड का उपयोग करें 'सार' के सामने 'कक्षा' कीवर्ड।
// उदाहरण के लिए सार वर्ग वर्ग-नाम {। । आभासी प्रकार functional_name (पैरामीटर_लिस्ट) = 0; । । };
- आभासी कार्यों को निश्चित रूप से आधार वर्ग में परिभाषित किया गया है और व्युत्पन्न वर्ग में पुनर्परिभाषित (ओवरराइड) किया गया है। दूसरी ओर, शुद्ध आभासी फ़ंक्शन बेस क्लास में विशेष रूप से परिभाषित नहीं होता है
- व्युत्पन्न वर्ग यदि आवश्यक हो तो वर्चुअल फ़ंक्शन को फिर से परिभाषित करें (ओवरराइड करें), जबकि शुद्ध आभासी फ़ंक्शन व्युत्पन्न वर्ग के मामले में निश्चित रूप से शुद्ध आभासी फ़ंक्शन को फिर से परिभाषित करना है।
- यदि व्युत्पन्न वर्ग वर्चुअल फ़ंक्शन को फिर से परिभाषित (ओवरराइड) करने में विफल रहता है, तो यह बेस क्लास के वर्चुअल फ़ंक्शन का उपयोग कर सकता है। इसके विपरीत, यदि एक व्युत्पन्न वर्ग शुद्ध आभासी फ़ंक्शन को ओवरराइड करने में विफल रहता है तो संकलन त्रुटि होती है।
- वर्चुअल फंक्शन वाले बेस क्लास को तत्काल बनाया जा सकता है यानी उसकी वस्तु बनाई जा सकती है। जैसा कि है, शुद्ध वर्चुअल फंक्शन यानी एक सार वर्ग वाले आधार वर्ग को तत्काल नहीं बनाया जा सकता है क्योंकि सार वर्ग पूरी तरह से परिभाषित नहीं है।
ध्यान दें:
Function वर्चुअल फंक्शन ’और remains प्योर वर्चुअल फंक्शन’ का प्रोटोटाइप पूरे कार्यक्रम में एक जैसा रहता है।
निष्कर्ष:
'वर्चुअल फ़ंक्शंस' और 'प्योर वर्चुअल फंक्शन' दोनों का अपना महत्व है, जैसा कि 'वर्चुअल फ़ंक्शंस' में होता है, सभी व्युत्पन्न वर्ग को वर्चुअल फ़ंक्शन को फिर से परिभाषित करने की आवश्यकता नहीं होती है और जहाँ हम चाहते हैं कि सभी व्युत्पन्न वर्ग को वर्चुअल फ़ंक्शन, शुद्ध आभासी को फिर से परिभाषित करना चाहिए फंक्शन बेस्ट वहीं लागू होता है।