आगे, हम एक तुलना चार्ट की मदद से ओवरलोडिंग और ओवरराइडिंग के बीच के अंतर का अध्ययन करते हैं।
तुलना चार्ट:
तुलना के लिए आधार | ओवरलोडिंग | अधिभावी |
---|---|---|
प्रोटोटाइप | प्रोटोटाइप भिन्न या संख्या के प्रकार के रूप में भिन्न हो सकता है। | प्रोटोटाइप के सभी पहलू समान होने चाहिए। |
कीवर्ड | ओवरलोडिंग के दौरान कोई कीवर्ड लागू नहीं किया गया। | फ़ंक्शन जिसे ओवरराइड किया जाना है, बेस क्लास में कीवर्ड 'वर्चुअल' से पहले होता है। |
भेद कारक | संख्या या प्रकार का पैरामीटर भिन्न होता है जो निर्धारित करता है कि फ़ंक्शन का संस्करण कहा जा रहा है। | किस कक्षा के फ़ंक्शन को पॉइंटर द्वारा बुलाया जा रहा है, यह निर्धारित किया जाता है, उस पॉइंटर को किस क्लास के ऑब्जेक्ट को सौंपा गया है। |
परिभाषित करने का पैटर्न | फ़ंक्शन को एक ही नाम से पुनर्परिभाषित किया जाता है, लेकिन विभिन्न संख्या और प्रकार के पैरामीटर। | फ़ंक्शन को परिभाषित किया गया है, जो मुख्य कक्षा में एक कीवर्ड 'वर्चुअल' से पहले है और आउट कीवर्ड के साथ व्युत्पन्न वर्ग द्वारा फिर से परिभाषित किया गया है। |
सिद्धि का समय | संकलन समय। | भागो समय। |
कंस्ट्रक्टर / वर्चुअल फ़ंक्शन | कन्स्ट्रक्टर्स को ओवरलोड किया जा सकता है। | वर्चुअल फ़ंक्शन को ओवरराइड किया जा सकता है। |
नाशक | विध्वंसक अतिभारित नहीं किया जा सकता है। | विध्वंसक को ओवरराइड किया जा सकता है। |
बाइंडिंग | ओवरलोडिंग से जल्द बंधन से छुटकारा मिलता है। | ओवरराइडिंग का अर्थ देर से बंधन से है। |
ओवरलोडिंग की परिभाषा
संकलन-समय के बहुरूपता को 'ओवरलोडिंग' कहा जाता है। जैसा कि ओवरलोडिंग बहुरूपता की अवधारणा से उत्पन्न होता है, यह "कई तरीकों के लिए एक सामान्य इंटरफ़ेस" प्रदान करता है। इसका मतलब है, यदि कोई फ़ंक्शन अतिभारित है, तो इसे पुनर्परिभाषित करते समय समान फ़ंक्शन नाम होता है।
अतिभारित कार्य विभिन्न 'संख्या या पैरामीटर (ओं) के संबंध में भिन्न होते हैं, यह एक अतिभारित कार्य को दूसरे से अलग बनाता है। इस तरह, संकलक पहचानता है कि कौन सा अतिभारित कार्य कहा जा रहा है। अधिकांश सामान्य रूप से अतिभारित कार्य 'कंस्ट्रक्टर' हैं। 'कॉपी कंस्ट्रक्टर' एक तरह का "कंस्ट्रक्टर ओवरलोडिंग" है।
C ++ में ओवरलोडिंग का कार्यान्वयन
वर्ग अधिभार {int a, b; सार्वजनिक: int लोड (int x) {// पहला लोड () फ़ंक्शन a = x; एक वापसी; } int load (इंट x, int y) {// सेकंड लोड () फंक्शन a = x; ख = y; वापसी एक * बी; }}; int main () {ओवरलोड O1; O1.load (20); // पहला लोड () फ़ंक्शन कॉल O1.load (20, 40); // दूसरा लोड () फ़ंक्शन कॉल}
यहां क्लास ओवरलोड के फंक्शन लोड () को ओवरलोड किया गया है। वर्ग के दो अतिभारित कार्यों को इस तरह से अलग किया जा सकता है कि पहले लोड () फ़ंक्शन केवल एकल पूर्णांक पैरामीटर को स्वीकार करता है, जबकि दूसरा लोड () फ़ंक्शन दो पूर्णांक पैरामीटर को स्वीकार करता है। जब क्लास अधिभार की वस्तु एक पैरामीटर के साथ लोड () फ़ंक्शन को कॉल करती है, तो पहले लोड () फ़ंक्शन को बुलाया जाता है। जब ऑब्जेक्ट कॉल लोड () फ़ंक्शन दो मापदंडों से गुजरता है, तो दूसरा लोड () फ़ंक्शन कहा जाता है।
ओवरराइडिंग की परिभाषा
रन-टाइम के दौरान हासिल की गई बहुरूपता को 'ओवरराइडिंग' कहा जाता है। यह 'वंशानुक्रम' और 'आभासी कार्यों' का उपयोग करके पूरा किया जाता है। ओवरराइड किए जाने वाले फ़ंक्शन को आधार वर्ग में 'वर्चुअल' कीवर्ड से पहले लिया गया है और किसी भी कीवर्ड के बिना व्युत्पन्न वर्ग में फिर से परिभाषित किया गया है।
ओवरराइडिंग के मामले में याद रखने वाली सबसे महत्वपूर्ण बात यह है कि ओवरराइड फ़ंक्शन का प्रोटोटाइप परिवर्तित नहीं होना चाहिए जबकि व्युत्पन्न वर्ग इसे फिर से परिभाषित करता है। जब ओवरराइड फ़ंक्शन को कॉल दिया जाता है, तो C ++ यह निर्धारित करता है कि फ़ंक्शन का कौन सा संस्करण एक पॉइंटर द्वारा इंगित ऑब्जेक्ट के प्रकार के आधार पर कहा जाता है जिसके द्वारा फ़ंक्शन कॉलिंग किया जाता है।
C ++ में ओवरराइडिंग का कार्यान्वयन
क्लास बेस {पब्लिक: वर्चुअल वॉयड फंक्शनल () {// बेस क्लास कॉउट का वर्चुअल फंक्शन << "यह बेस क्लास का फंक्शनल () है"; }}; वर्ग व्युत्पन्न 1: सार्वजनिक आधार {सार्वजनिक: शून्य कार्यात्मक () {// बेस क्लास के वर्चुअल फ़ंक्शन को व्युत्पन्न 1 वर्ग cout में पुनः परिभाषित किया गया है << "यह एक व्युत्पन्न 1 वर्ग का कार्यात्मक () है;" }}; वर्ग व्युत्पन्न 2: सार्वजनिक आधार {सार्वजनिक: शून्य कार्यात्मक () {// बेस 2 के आभासी कार्य को व्युत्पन्न किया गया हैfunct (); // कॉल करने के लिए der1 वर्ग कार्यात्मक ()। * पी = और d2; p-> funct (); // व्युत्पन्न वर्ग के कार्यात्मक () के लिए कॉल करें। वापसी 0; }
यहां, एक एकल आधार वर्ग है जो सार्वजनिक रूप से दो व्युत्पन्न वर्गों द्वारा विरासत में मिला है। एक वर्चुअल फ़ंक्शन को एक आधार वर्ग में एक कीवर्ड 'वर्चुअल' के साथ परिभाषित किया गया है, और इसे दोनों व्युत्पन्न वर्गों द्वारा बिना किसी कीवर्ड के फिर से परिभाषित किया गया है। मुख्य () में, बेस क्लास एक पॉइंटर वैरिएबल 'p' और ऑब्जेक्ट 'b' बनाता है; 'व्युत्पन्न 1 वर्ग एक ऑब्जेक्ट बनाता है डी 1 और व्युत्पन्न 2 क्लास एक ऑब्जेक्ट डी 2 बनाता है'।
अब, शुरू में बेस क्लास के ऑब्जेक्ट 'बी' का पता बेस क्लास 'पी' के पॉइंटर को सौंपा गया है। 'p' फंक्शन फ़ंक्शनल () को कॉल देता है, इसलिए बेस क्लास के एक फंक्शन को कहा जाता है। फिर व्युत्पन्न 1 वर्ग ऑब्जेक्ट 'डी 1' का पता पॉइंटर 'पी' को सौंपा गया है, फिर से यह फंक्शनल को कॉल करता है; यहाँ फ़ंक्शन फंक्शन () व्युत्पन्न वर्ग का निष्पादन किया गया है। अंत में, सूचक 'पी' व्युत्पन्न वर्ग 2 के ऑब्जेक्ट को सौंपा गया है। फिर 'p' कॉल फंक्शनल फंक्शनल () है जो कि व्युत्पन्न 2 वर्ग के फंक्शन फंक () को निष्पादित करता है।
यदि व्युत्पन्न / व्युत्पन्न 2 वर्ग ने फंक्शनल को फिर से परिभाषित नहीं किया है, तो बेस फंक्शन के फंक्शनल () को वर्चुअल फंक्शन कहा जाता है।
ओवरलोडिंग और ओवरराइडिंग के बीच महत्वपूर्ण अंतर
- एक फ़ंक्शन का प्रोटोटाइप जो अतिभारित किया जा रहा है, वह प्रकार और पैरामीटर के कारण भिन्न होता है जो ओवरलोड फ़ंक्शन को पास किए जाते हैं। दूसरी ओर, ओवरराइड फ़ंक्शन का प्रोटोटाइप नहीं बदलता है क्योंकि एक ओवरराइड फ़ंक्शन अलग-अलग वर्ग के लिए अलग-अलग कार्रवाई करता है जो इसके अंतर्गत आता है, लेकिन एक ही प्रकार और पैरामीटर की संख्या के साथ।
- अतिभारित फ़ंक्शन का नाम किसी भी कीवर्ड से पहले नहीं होता है, जबकि ओवरराइड फ़ंक्शन का नाम केवल आधार वर्ग में कीर "वर्चुअल" से पहले होता है।
- जो अतिभारित फ़ंक्शन को लागू किया जाता है, वह उस प्रकार या पैरामीटर पर निर्भर करता है जो फ़ंक्शन को पास किया जाता है। किस वर्ग का ओवरराइड किया गया फ़ंक्शन इस बात पर निर्भर करता है कि किस क्लास के ऑब्जेक्ट का पता पॉइंटर को सौंपा गया है, जिसने फ़ंक्शन को इनवॉइस किया है।
- जो अतिभारित फ़ंक्शन को संकलित किया जाना है वह संकलन समय के दौरान हल किया जाता है। ओवरराइड किए जाने वाले फ़ंक्शन को रनटाइम के दौरान हल किया जाता है।
- कन्स्ट्रक्टर्स को ओवरलोड किया जा सकता है लेकिन ओवरराइड नहीं किया जा सकता है।
- विध्वंसक अतिभारित नहीं हो सकते हैं, लेकिन उन्हें ओवरराइड किया जा सकता है।
- ओवरलोडिंग जल्दी बाध्यकारी हो जाती है, जिसके कारण ओवरलोड फ़ंक्शन को संकलित किया जाएगा, संकलन समय के दौरान हल किया जाएगा। ओवरराइडिंग देर से बंधन को प्राप्त करती है, क्योंकि ओवरराइड फ़ंक्शन को इनवॉइस किया जाएगा जो रनटाइम के दौरान हल किया जाता है।
समानताएँ
- दोनों एक वर्ग के सदस्य कार्यों पर लागू होते हैं।
- इन दोनों के पीछे बहुरूपता मूल अवधारणा है।
- जब हम कार्यों को ओवरलोडिंग और ओवरराइडिंग पर लागू करते हैं तो फ़ंक्शन का नाम समान रहता है।
निष्कर्ष
ओवरलोडिंग और ओवरराइडिंग समान दिखाई देते हैं, लेकिन यह मामला नहीं है। कार्यों को अतिभारित किया जा सकता है लेकिन, कोई भी वर्ग भविष्य में अतिभारित कार्य को फिर से परिभाषित नहीं कर सकता है। वर्चुअल फ़ंक्शन को अधिभारित नहीं किया जा सकता है; उन्हें केवल ओवरराइड किया जा सकता है।