C ++ में फ़ंक्शन ओवरलोडिंग और ओवरराइडिंग के बीच अंतर

लेखक: Laura McKinney
निर्माण की तारीख: 1 अप्रैल 2021
डेट अपडेट करें: 11 मई 2024
Anonim
फंक्शन ओवरलोडिंग और फंक्शन ओवरराइडिंग के बीच अंतर | c++ में ओवरलोडिंग और ओवरराइडिंग
वीडियो: फंक्शन ओवरलोडिंग और फंक्शन ओवरराइडिंग के बीच अंतर | c++ में ओवरलोडिंग और ओवरराइडिंग

विषय


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

बहुरूपता OOP की महत्वपूर्ण विशेषताओं में से एक है। इसका सीधा सा अर्थ है। एक से अधिक रूपों के लिए एक नाम का उपयोग करना ’। बहुरूपता को 'फ़ंक्शन ओवरलोडिंग', 'ऑपरेटर ओवरलोडिंग' और 'वर्चुअल फ़ंक्शन' का उपयोग करके लागू किया जा सकता है। दोनों, 'ओवरलोडिंग' और 'ओवरराइडिंग' का अर्थ बहुरूपता की अवधारणा है। यहाँ, 'ओवरलोडिंग' संकलन समय बहुरूपता है और 'ओवरराइडिंग' रन टाइम बहुरूपता है। यदि हम 'ओवरलोडिंग' और 'ओवरराइडिंग' में बड़े अंतर के बारे में बात करते हैं, तो आगे अध्ययन करना है।

आगे, हम एक तुलना चार्ट की मदद से ओवरलोडिंग और ओवरराइडिंग के बीच के अंतर का अध्ययन करते हैं।


  1. तुलना चार्ट
  2. परिभाषा
  3. मुख्य अंतर
  4. समानताएँ
  5. निष्कर्ष


तुलना चार्ट:

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


ओवरलोडिंग की परिभाषा

संकलन-समय के बहुरूपता को ing ओवरलोडिंग ’कहा जाता है। जैसा कि ओवरलोडिंग को बहुरूपता की अवधारणा से उत्पन्न किया जाता है, यह“ कई तरीकों के लिए एक सामान्य इंटरफ़ेस ”प्रदान करता है। इसका मतलब है, यदि कोई फ़ंक्शन अतिभारित है, तो इसे पुनर्परिभाषित करते समय समान फ़ंक्शन नाम होता है।

ओवरलोड किए गए फ़ंक्शंस अलग-अलग type संख्या या प्रकार के पैरामीटर (ओं) के संबंध में भिन्न हैं, यह एक अतिभारित फ़ंक्शन को दूसरे से अलग बनाता है। इस तरह, संकलक पहचानता है कि कौन सा अतिभारित कार्य कहा जा रहा है। अधिकांश आमतौर पर अतिभारित कार्य 'निर्माता' होते हैं। Or कॉपी कंस्ट्रक्टर ’एक तरह का“ कंस्ट्रक्टर ओवरलोडिंग ”है।

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); // दूसरा लोड () फ़ंक्शन कॉल}

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

ओवरराइडिंग की परिभाषा

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

ओवरराइडिंग के मामले में याद रखने वाली सबसे महत्वपूर्ण बात यह है कि ओवरराइड फ़ंक्शन के प्रोटोटाइप को परिवर्तित नहीं करना चाहिए जबकि व्युत्पन्न वर्ग इसे फिर से परिभाषित करता है। जब ओवरराइड फ़ंक्शन को कॉल दिया जाता है, तो C ++ यह निर्धारित करता है कि फ़ंक्शन का कौन सा संस्करण एक पॉइंटर द्वारा इंगित ऑब्जेक्ट के प्रकार पर आधारित है, जिसके द्वारा फ़ंक्शन कॉलिंग किया जाता है।

C ++ में ओवरराइडिंग का कार्यान्वयन

क्लास बेस {पब्लिक: वर्चुअल वॉयस फंक्शनल () {// बेस क्लास कॉउट का वर्चुअल फंक्शन << "यह बेस क्लास फंक्शनल () है;" }}; वर्ग व्युत्पन्न 1: सार्वजनिक आधार {सार्वजनिक: शून्य कार्यात्मक () {// बेस क्लास के वर्चुअल फ़ंक्शन को व्युत्पन्न 1 वर्ग cout में पुनः परिभाषित किया गया है << "यह एक व्युत्पन्न 1 वर्ग कार्यात्मक () है;" }}; वर्ग व्युत्पन्न 2: सार्वजनिक आधार {सार्वजनिक: शून्य फ़ंक्शनल () {// बेस क्लास के वर्चुअल फ़ंक्शन को व्युत्पन्न 2 वर्ग cout में पुनः परिभाषित किया गया है << "यह एक व्युत्पन्न 2 क्लास फ़ंक्शंस () है;" }}; int main () {आधार * p, b; व्युत्पन्न d1; व्युत्पन्न d2; * पी = एंड बी; p-> funct (); // बेस क्लास फंक्शनल () को कॉल करें। * पी = & d1; p-> funct (); // कॉल करने के लिए der1 वर्ग कार्यात्मक ()। * पी = और d2; p-> funct (); // व्युत्पन्न वर्ग के कार्यात्मक () के लिए कॉल करें। वापसी 0; }

यहां, एक एकल आधार वर्ग है जो सार्वजनिक रूप से दो व्युत्पन्न वर्गों द्वारा विरासत में मिला है। एक आभासी फ़ंक्शन को एक आधार वर्ग में एक कीवर्ड 'वर्चुअल' के साथ परिभाषित किया गया है, और इसे दोनों व्युत्पन्न वर्गों द्वारा बिना किसी कीवर्ड के फिर से परिभाषित किया गया है। मुख्य () में, बेस क्लास एक पॉइंटर वैरिएबल 'पी' और ऑब्जेक्ट 'बी' बनाता है; ‘व्युत्पन्न‘ वर्ग एक वस्तु d1 बनाता है और व्युत्पन्न वर्ग एक वस्तु d2 बनाता है ’।

अब, शुरू में बेस क्लास के ऑब्जेक्ट 'b' का पता बेस क्लास 'p' के पॉइंटर को सौंपा गया है। ‘P 'फ़ंक्शन फ़ंक्शनल () को एक कॉल देता है, इसलिए बेस क्लास के एक फ़ंक्शन को कहा जाता है।तब व्युत्पन्न 1 वर्ग ऑब्जेक्ट 'डी 1' का पता पॉइंटर ’पी 'को सौंपा गया है, फिर से यह फंक्शनल को कॉल करता है (); यहाँ फ़ंक्शन फंक्शन () व्युत्पन्न वर्ग का निष्पादन किया गया है। अंत में, सूचक ’p’ व्युत्पन्न वर्ग 2 के ऑब्जेक्ट को सौंपा गया है। तब utes p 'फ़ंक्शन फ़ंक्शन को कॉल करता है () जो व्युत्पन्न वर्ग के फ़ंक्शन फ़ंक्शनल () को निष्पादित करता है।

यदि व्युत्पन्न / व्युत्पन्न 2 वर्ग ने कार्यात्मक को फिर से परिभाषित नहीं किया है, तो आधार वर्ग के कार्यात्मक () को बुलाया जाएगा, क्योंकि आभासी फ़ंक्शन ier पदानुक्रमित हैं। '

  1. एक फ़ंक्शन का प्रोटोटाइप जो अतिभारित किया जा रहा है, वह प्रकार और पैरामीटर के कारण भिन्न होता है जो ओवरलोड फ़ंक्शन को पास किए जाते हैं। दूसरी ओर, ओवरराइड फ़ंक्शन का प्रोटोटाइप नहीं बदलता है क्योंकि एक ओवरराइड फ़ंक्शन अलग-अलग वर्ग के लिए अलग-अलग कार्रवाई करता है जो इसके अंतर्गत आता है, लेकिन एक ही प्रकार और पैरामीटर की संख्या के साथ।
  2. अतिभारित फ़ंक्शन का नाम किसी भी कीवर्ड से पहले नहीं होता है, जबकि ओवरराइड फ़ंक्शन का नाम केवल आधार वर्ग में कीर "वर्चुअल" से पहले होता है।
  3. जो अतिभारित फ़ंक्शन को लागू किया जाता है, वह उस प्रकार या पैरामीटर पर निर्भर करता है जो फ़ंक्शन को पास किया जाता है। किस वर्ग का ओवरराइड किया गया फ़ंक्शन है, इस पर निर्भर करता है कि किस क्लास का ऑब्जेक्ट पता पॉइंटर को सौंपा गया है, जिसने फ़ंक्शन को इनवॉइस किया है।
  4. जो अतिभारित फ़ंक्शन को संकलित किया जाना है वह संकलन समय के दौरान हल किया जाता है। ओवरराइड किए जाने वाले फ़ंक्शन को रनटाइम के दौरान हल किया जाता है।
  5. कन्स्ट्रक्टर्स को ओवरलोड किया जा सकता है लेकिन ओवरराइड नहीं किया जा सकता है।
  6. विध्वंसक अतिभारित नहीं हो सकते हैं, लेकिन उन्हें ओवरराइड किया जा सकता है।
  7. ओवरलोडिंग जल्दी बाध्यकारी हो जाती है, जिसके कारण ओवरलोड फ़ंक्शन को संकलित किया जाएगा, संकलन समय के दौरान हल किया जाएगा। ओवरराइडिंग देर से बंधन को प्राप्त करती है, क्योंकि ओवरराइड फ़ंक्शन को इनवॉइस किया जाएगा जो रनटाइम के दौरान हल किया जाता है।

समानताएँ

  1. दोनों एक वर्ग के सदस्य कार्यों पर लागू होते हैं।
  2. इन दोनों के पीछे बहुरूपता मूल अवधारणा है।
  3. जब हम कार्यों को ओवरलोडिंग और ओवरराइडिंग पर लागू करते हैं तो फ़ंक्शन का नाम समान रहता है।

निष्कर्ष

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