C ++ में बहुरूपता क्या है?
C ++ में, बहुरूपता एक सदस्य फ़ंक्शन को उस वस्तु के आधार पर अलग-अलग व्यवहार करने का कारण बनता है जो इसे कॉल / चालान करता है। बहुरूपता एक ग्रीक शब्द है जिसका अर्थ है कई रूप। यह तब होता है जब आपके पास वंशानुक्रम के माध्यम से संबंधित कक्षाओं का एक पदानुक्रम होता है।
उदाहरण के लिए, मान लें कि हमारे पास फ़ंक्शन मेकसाउंड () है। जब एक बिल्ली इस फ़ंक्शन को बुलाती है, तो यह म्याऊ ध्वनि का उत्पादन करेगी। जब एक गाय एक ही कार्य करता है, तो यह स्वर ध्वनि प्रदान करेगा।
हालांकि हमारा एक कार्य है, यह अलग-अलग परिस्थितियों में अलग-अलग व्यवहार करता है। फ़ंक्शन के कई रूप हैं; इसलिए, हमने बहुरूपता प्राप्त किया है।
इस C ++ ट्यूटोरियल में, आप सीखेंगे:
- बहुरूपता क्या है?
- बहुरूपता के प्रकार
- संकलन समय बहुरूपता
- ओवरलोडिंग
- ऑपरेटर ओवरलोडिंग
- रनटाइम पॉलीमॉर्फिज़्म
- ओवरराइडिंग
- C ++ वर्चुअल फ़ंक्शन
- संकलन-समय बहुरूपता बनाम। रन-टाइम बहुरूपता
बहुरूपता के प्रकार
C ++ दो प्रकार के बहुरूपता का समर्थन करता है:
- संकलन-समय बहुरूपता, और
- रनटाइम बहुरूपता।
संकलन समय बहुरूपता
आप संख्याओं और प्रकार के तर्कों का मिलान करके अतिभारित कार्यों को लागू करते हैं। जानकारी संकलन-समय के दौरान मौजूद है। इसका मतलब है कि C ++ कंपाइलर कंपाइल टाइम पर सही फंक्शन का चयन करेगा।
कंपाइल-टाइम पॉलीमॉर्फिज्म फंक्शन ओवरलोडिंग और ऑपरेटर ओवरलोडिंग के माध्यम से प्राप्त किया जाता है।
ओवरलोडिंग
फ़ंक्शन ओवरलोडिंग तब होती है जब हमारे पास समान नामों के साथ कई कार्य होते हैं लेकिन विभिन्न तर्क। संख्या या प्रकार के संदर्भ में तर्क भिन्न हो सकते हैं।
उदाहरण 1:
#includeusing namespace std;void test(int i) {cout << " The int is " << i << endl;}void test(double f) {cout << " The float is " << f << endl;}void test(char const *ch) {cout << " The char* is " << ch << endl;}int main() {test(5);test(5.5);test("five");return 0;}
आउटपुट:
यहाँ कोड का एक स्क्रीनशॉट है:
कोड स्पष्टीकरण:
- हमारे कोड में iostream हेडर फ़ाइल शामिल करें। हम इसके कार्यों का उपयोग करने में सक्षम होंगे।
- हमारे कोड में std नाम स्थान शामिल करें। हम बिना बुलाए इसके कक्षाओं का उपयोग कर पाएंगे।
- एक फ़ंक्शन नाम बनाएँ जो पूर्णांक पैरामीटर i का परीक्षण करता है। {फंक्शन टेस्ट की बॉडी की शुरुआत के निशान।
- उपरोक्त कार्य परीक्षण के आह्वान / बुलाए जाने पर निष्पादित होने वाला विवरण।
- उपरोक्त फ़ंक्शन परीक्षण के शरीर का अंत।
- एक परीक्षण नाम बनाएँ जो एक फ्लोट पैरामीटर f लेता है। {फंक्शन टेस्ट की बॉडी की शुरुआत के निशान।
- उपरोक्त कार्य परीक्षण के आह्वान / बुलाए जाने पर निष्पादित होने वाला विवरण।
- उपरोक्त फ़ंक्शन परीक्षण के शरीर का अंत।
- एक परीक्षण नाम बनाएँ जो एक चरित्र पैरामीटर ch लेता है। {फंक्शन टेस्ट की बॉडी की शुरुआत के निशान।
- उपरोक्त कार्य परीक्षण के आह्वान / बुलाए जाने पर निष्पादित होने वाला विवरण।
- उपरोक्त फ़ंक्शन परीक्षण के शरीर का अंत।
- मुख्य () फ़ंक्शन को कॉल करें। {फ़ंक्शन के शरीर की शुरुआत के निशान।
- फ़ंक्शन परीक्षण को कॉल करें और तर्क के मूल्य के रूप में इसे 5 पास करें। यह परीक्षण फ़ंक्शन को आमंत्रित करता है जो पूर्णांक तर्क को स्वीकार करता है, अर्थात, पहला परीक्षण फ़ंक्शन।
- फ़ंक्शन परीक्षण को कॉल करें और इसे तर्क के मान के रूप में 5.5 से गुजर रहा है। यह एक फ्लोट तर्क को स्वीकार करने वाले परीक्षण फ़ंक्शन को लागू करेगा, अर्थात दूसरा परीक्षण कार्य।
- फ़ंक्शन परीक्षण को कॉल करें और तर्क के मूल्य के रूप में इसे पांच पास करें। यह उस परीक्षण फ़ंक्शन का आह्वान करेगा जो एक चरित्र तर्क को स्वीकार करता है, अर्थात तीसरा परीक्षण कार्य।
- यदि यह सफलतापूर्वक चलता है, तो प्रोग्राम को एक मूल्य वापस करना चाहिए।
- मुख्य () फ़ंक्शन के शरीर का अंत।
हमारे पास एक ही नाम के तीन कार्य हैं लेकिन विभिन्न प्रकार के तर्क हैं। हमने बहुरूपता को प्राप्त किया है।
ऑपरेटर ओवरलोडिंग
ऑपरेटर ओवरलोडिंग में, हम C ++ ऑपरेटर के लिए एक नया अर्थ परिभाषित करते हैं। यह भी बदलता है कि ऑपरेटर कैसे काम करता है। उदाहरण के लिए, हम दो तारों को समेटने के लिए + ऑपरेटर को परिभाषित कर सकते हैं। हम इसे संख्यात्मक मानों को जोड़ने के अतिरिक्त संचालक के रूप में जानते हैं। हमारी परिभाषा के बाद, जब पूर्णांकों के बीच रखा जाता है, तो यह उन्हें जोड़ देगा। जब तार के बीच रखा जाता है, तो यह उन्हें अलग कर देगा।
उदाहरण 2:
#includeusing namespace std;class ComplexNum {private:int real, over;public:ComplexNum(int rl = 0, int ov = 0) {real = rl;over = ov;}ComplexNum operator + (ComplexNum const &obj) {ComplexNum result;result.real = real + obj.real;result.over = over + obj.over;return result;}void print() {cout << real << " + i" << over << endl;}};int main(){ComplexNum c1(10, 2), c2(3, 7);ComplexNum c3 = c1+c2;c3.print();}
आउटपुट:
यहाँ कोड का एक स्क्रीनशॉट है:
कोड स्पष्टीकरण:
- अपने कार्यों का उपयोग करने के लिए हमारे प्रोग्राम में iostream हेडर फ़ाइल शामिल करें।
- हमारे प्रोग्राम में std नेमस्पेस शामिल करें ताकि बिना कॉल किए उसकी कक्षाओं का उपयोग किया जा सके।
- ComplexNum नामक एक क्लास बनाएँ। {वर्ग शरीर की शुरुआत के निशान।
- वैरिएबल को निजी के रूप में चिह्नित करने के लिए निजी एक्सेस संशोधक का उपयोग करें, जिसका अर्थ है कि उन्हें केवल कक्षा के भीतर से ही एक्सेस किया जा सकता है।
- वास्तविक और अधिक दो पूर्णांक चर को परिभाषित करें।
- कंस्ट्रक्टर को सार्वजनिक रूप से चिह्नित करने के लिए सार्वजनिक पहुंच संशोधक का उपयोग करें, जिसका अर्थ है कि यह कक्षा के बाहर से भी सुलभ होगा।
- क्लास कंस्ट्रक्टर बनाएं और वैरिएबल को इनिशियलाइज़ करें।
- वैरिएबल रियल के मूल्य को आरम्भ करें।
- वैरिएबल ओवर का मान आरंभ करें।
- कंस्ट्रक्टर बॉडी का अंत।
- हमें + ऑपरेटर के अर्थ को ओवरराइड करने की आवश्यकता है।
- कॉम्प्लेक्सनम का डेटा टाइप परिणाम बनाएं।
- जटिल संख्या के साथ + ऑपरेटर का उपयोग करें। यह रेखा किसी संख्या के वास्तविक भाग को किसी अन्य संख्या के वास्तविक भाग से जोड़ेगी।
- जटिल संख्या के साथ + ऑपरेटर का उपयोग करें। यह रेखा किसी संख्या के काल्पनिक भाग को किसी अन्य संख्या के काल्पनिक भाग से जोड़ेगी।
- कार्यक्रम सफल निष्पादन पर चर परिणाम का मूल्य लौटाएगा।
- + ऑपरेटर के नए अर्थ की परिभाषा का अंत, अर्थात्, ओवरलोडिंग।
- कॉल प्रिंट () विधि।
- कंसोल पर जोड़ने के बाद नया कॉम्प्लेक्स नंबर प्रिंट करें।
- प्रिंट के शरीर का अंत () फ़ंक्शन।
- कॉम्प्लेक्सनम वर्ग के शरीर का अंत।
- मुख्य () फ़ंक्शन को कॉल करें।
- जोड़े जाने वाले वास्तविक और जटिल दोनों भागों के मूल्यों को पास करें। C1 के पहले भाग को c2 के पहले भाग यानी 10 + 3 में जोड़ा जाएगा। C1 के दूसरे भाग को c के दूसरे भाग में जोड़ा जाएगा, अर्थात 2 + 7।
- अतिभारित + ऑपरेटर का उपयोग करके एक ऑपरेशन करें और परिणाम को चर c3 में संग्रहीत करें।
- कंसोल पर वेरिएबल c3 का मान प्रिंट करें।
- मुख्य () फ़ंक्शन के शरीर का अंत।
रनटाइम पॉलीमॉर्फिज़्म
ऐसा तब होता है जब किसी वस्तु का तरीका संकलित समय के बजाय रनटाइम के दौरान बुलाया / बुलाया जाता है। फ़ंक्शन ओवरराइडिंग के माध्यम से रनटाइम पॉलीमोर्फिज़्म प्राप्त किया जाता है। कहा जाता है / आह्वान समारोह रनटाइम के दौरान स्थापित किया गया है।
ओवरराइडिंग
फंक्शन ओवरराइडिंग तब होती है जब बेस क्लास के एक फंक्शन को एक व्युत्पन्न क्लास में एक नई परिभाषा दी जाती है। उस समय, हम कह सकते हैं कि बेस फंक्शन ओवरराइड हो गया है।
उदाहरण के लिए:
#includeusing namespace std;class Mammal {public:void eat() {cout << "Mammals eat… ";}};class Cow: public Mammal {public:void eat() {cout << "Cows eat grass… ";}};int main(void) {Cow c = Cow();c.eat();return 0;}
आउटपुट:
यहाँ कोड का एक स्क्रीनशॉट है:
कोड स्पष्टीकरण:
- अपने कार्य का उपयोग करने के लिए हमारे प्रोग्राम में iostream हेडर फ़ाइल आयात करें।
- हमारे प्रोग्राम में std नेमस्पेस शामिल करें ताकि बिना कॉल किए उसकी कक्षाओं का उपयोग किया जा सके।
- एक वर्ग बनाएं जिसका नाम है स्तनपायी। {वर्ग शरीर की शुरुआत के निशान।
- सार्वजनिक पहुंच संशोधक का उपयोग उस फ़ंक्शन को सेट करने के लिए करें जिसे हम सार्वजनिक रूप से सुलभ बनाने के बारे में हैं। यह इस वर्ग के बाहर से सुलभ होगा।
- खाने के नाम से एक सार्वजनिक समारोह बनाएँ। {फ़ंक्शन बॉडी की शुरुआत के निशान।
- जब फ़ंक्शन खाने () का आह्वान किया जाता है तो कॉउट फ़ंक्शन में जोड़ा गया स्टेटमेंट प्रिंट करें।
- फ़ंक्शन खाने के शरीर का अंत ()।
- वर्ग स्तनपायी के शरीर का अंत।
- गाय नामक एक वर्ग बनाएं जो स्तनपायी वर्ग को विरासत में मिले। गाय व्युत्पन्न वर्ग है, जबकि स्तनपायी आधार वर्ग है। {इस वर्ग की शुरुआत के निशान।
- जिस फ़ंक्शन के बारे में हम सार्वजनिक रूप से सुलभ बनाने वाले हैं, उसे चिह्नित करने के लिए सार्वजनिक पहुँच संशोधक का उपयोग करें। यह इस वर्ग के बाहर से सुलभ होगा।
- बेस क्लास में परिभाषित फ़ंक्शन खाने () को ओवरराइड करें। {फ़ंक्शन बॉडी की शुरुआत के निशान।
- यह फ़ंक्शन लागू होने पर कंसोल पर मुद्रित करने के लिए कथन।
- समारोह खाने के शरीर का अंत ()।
- गाय के शरीर का अंत।
- मुख्य () फ़ंक्शन को कॉल करें। {इस फ़ंक्शन के शरीर की शुरुआत के निशान।
- गाय वर्ग का एक उदाहरण बनाएं और इसे सी नाम दें।
- काउ क्लास में परिभाषित खाने () फ़ंक्शन को कॉल करें।
- कार्यक्रम को सफल समापन पर एक मूल्य वापस करना होगा।
- मुख्य () फ़ंक्शन का अंत।
C ++ वर्चुअल फ़ंक्शन
एक वर्चुअल फ़ंक्शन C ++ में रन-टाइम बहुरूपता को लागू करने का एक और तरीका है। यह बेस क्लास में परिभाषित एक विशेष कार्य है और व्युत्पन्न वर्ग में फिर से परिभाषित किया गया है। वर्चुअल फ़ंक्शन घोषित करने के लिए, आपको वर्चुअल कीवर्ड का उपयोग करना चाहिए। कीवर्ड को बेस क्लास में फ़ंक्शन की घोषणा से पहले होना चाहिए।
यदि कोई वर्चुअल फ़ंक्शन क्लास इनहेरिट की गई है, तो वर्चुअल क्लास वर्चुअल फ़ंक्शन को उसकी आवश्यकताओं के अनुरूप पुनर्परिभाषित करती है। उदाहरण के लिए:
#includeusing namespace std;class ClassA {public:virtual void show() {cout << "The show() function in base class invoked… " << endl;}};class ClassB :public ClassA {public:void show() {cout << "The show() function in derived class invoked… ";}};int main() {ClassA* a;ClassB b;a = &b;a->show();}
आउटपुट:
यहाँ कोड का एक स्क्रीनशॉट है:
कोड स्पष्टीकरण:
- अपने कार्यों का उपयोग करने के लिए कोड में iostream हेडर फ़ाइल शामिल करें।
- इसे कॉल किए बिना अपनी कक्षाओं का उपयोग करने के लिए हमारे कोड में std नाम स्थान शामिल करें।
- ClassA नामक एक क्लास बनाएं।
- सार्वजनिक रूप से सुलभ के रूप में एक वर्ग के सदस्य को चिह्नित करने के लिए सार्वजनिक पहुंच संशोधक का उपयोग करें।
- शो () नाम का एक वर्चुअल फंक्शन बनाएं। यह एक सार्वजनिक समारोह होगा।
- शो () के आने पर टेक्स्ट को प्रिंट किया जाता है। एंडल एक C ++ कीवर्ड है, जिसका मतलब है एंड लाइन। यह माउस कर्सर को अगली पंक्ति में ले जाता है।
- वर्चुअल फ़ंक्शन शो के शरीर का अंत ()।
- क्लास क्लास के शरीर का अंत।
- क्लासबी नामक एक नया वर्ग बनाना जो क्लास क्लास को विरासत में मिले। ClassA बेस क्लास बन जाता है जबकि ClassB व्युत्पन्न क्लास बन जाता है।
- सार्वजनिक रूप से सुलभ के रूप में एक वर्ग के सदस्य को चिह्नित करने के लिए सार्वजनिक पहुंच संशोधक का उपयोग करें।
- बेस क्लास में प्राप्त वर्चुअल फंक्शन शो () को फिर से परिभाषित करें।
- व्युत्पन्न वर्ग में परिभाषित शो () फ़ंक्शन को लागू करने पर कंसोल पर मुद्रित करने के लिए पाठ लागू होता है।
- शो के शरीर का अंत () फ़ंक्शन।
- व्युत्पन्न वर्ग के शरीर का अंत, क्लासबी।
- मुख्य () फ़ंक्शन को कॉल करें। कार्यक्रम तर्क को इसके शरीर के भीतर जोड़ा जाना चाहिए।
- एक पॉइंटर वैरिएबल बनाएं जिसका नाम a है। यह ClassA नाम के वर्ग की ओर इशारा करता है।
- क्लासबी नामक कक्षा का एक उदाहरण बनाएं। उदाहरण को b नाम दिया गया है।
- वैरिएबल b में पता भंडार में मान स्टोर असाइन करें।
- व्युत्पन्न वर्ग में परिभाषित शो () फ़ंक्शन को लागू करें। देर से बाध्यकारी लागू किया गया है।
- मुख्य () फ़ंक्शन के शरीर का अंत।
संकलन-समय बहुरूपता बनाम। रन-टाइम बहुरूपता
यहाँ दोनों के बीच प्रमुख अंतर हैं:
संकलन-समय बहुरूपता | रन-टाइम बहुरूपता |
इसे प्रारंभिक बंधन या स्थैतिक बहुरूपता भी कहा जाता है | इसे देर से / गतिशील बंधन या गतिशील बहुरूपता भी कहा जाता है |
संकलन समय के दौरान विधि को बुलाया / आमंत्रित किया जाता है | रन टाइम के दौरान विधि को कॉल / इनवॉइस किया जाता है |
फ़ंक्शन ओवरलोडिंग और ऑपरेटर ओवरलोडिंग के माध्यम से लागू किया गया | ओवरराइडिंग और वर्चुअल फ़ंक्शंस के माध्यम से कार्यान्वित किया जाता है |
उदाहरण, विधि ओवरलोडिंग। कई विधियों के नाम समान हो सकते हैं लेकिन विभिन्न संख्या या प्रकार के तर्क | उदाहरण, विधि ओवरराइडिंग। कई विधियों में समान नाम और समान प्रोटोटाइप हो सकते हैं। |
संकलित समय के दौरान तरीकों की खोज के बाद से तेजी से निष्पादन | विधि खोजकर्ता के बाद से धीमी गति से निष्पादन रनटाइम के दौरान किया जाता है। |
समस्या-समाधान के लिए कम लचीलापन प्रदान किया जाता है क्योंकि सब कुछ संकलन समय के दौरान जाना जाता है। | रनटाइम के दौरान तरीकों की खोज के बाद जटिल समस्याओं को हल करने के लिए बहुत लचीलापन प्रदान किया जाता है। |
सारांश:
- बहुरूपता का अर्थ है कई रूपों का होना।
- यह तब होता है जब वंशानुक्रम के माध्यम से संबंधित वर्गों का एक पदानुक्रम होता है।
- बहुरूपता के साथ, एक फ़ंक्शन उस वस्तु के आधार पर अलग-अलग व्यवहार कर सकता है जो इसे बुलाता है।
- संकलन-समय के बहुरूपता में, संकलित होने वाले कार्य को संकलन-समय के दौरान स्थापित किया जाता है।
- रनटाइम पॉलीमॉर्फिज्म में, इनवॉइस किए जाने वाले फ़ंक्शन को रनटाइम के दौरान स्थापित किया जाता है।
- कंपाइल-टाइम पॉलिमोर्फ़िज्म को फ़ंक्शन ओवरलोडिंग और ऑपरेटर ओवरलोडिंग के माध्यम से निर्धारित किया जाता है।
- फ़ंक्शन ओवरलोडिंग में, समान नाम लेकिन विभिन्न तर्कों के साथ कई कार्य हैं।
- पैरामीटर संख्या या प्रकार में भिन्न हो सकते हैं।
- ऑपरेटर ओवरलोडिंग में, C ++ ऑपरेटरों के लिए एक नया अर्थ परिभाषित किया गया है।
- फ़ंक्शन ओवरराइडिंग के माध्यम से रनटाइम पॉलीमोर्फिज़्म प्राप्त किया जाता है।
- फ़ंक्शन ओवरराइडिंग में, एक व्युत्पन्न वर्ग बेस क्लास में परिभाषित फ़ंक्शन को एक नई परिभाषा देता है।