इस ट्यूटोरियल में, हम उदाहरणों की मदद से C ++ में बहुरूपता के बारे में जानेंगे।
बहुरूपता वस्तु-उन्मुख प्रोग्रामिंग की एक महत्वपूर्ण अवधारणा है। इसका सीधा मतलब है एक से अधिक फॉर्म। यही है, एक ही इकाई (फ़ंक्शन या ऑपरेटर) अलग-अलग परिदृश्यों में अलग-अलग व्यवहार करता है। उदाहरण के लिए,
+
सी ++ में ऑपरेटर दो विशिष्ट कार्य करने के लिए प्रयोग किया जाता है। जब इसका उपयोग संख्याओं (पूर्णांक और फ्लोटिंग-पॉइंट संख्या) के साथ किया जाता है, तो यह जोड़ देता है।
int a = 5; int b = 6; int sum = a + b; // sum = 11
और जब हम +
ऑपरेटर को स्ट्रिंग्स के साथ उपयोग करते हैं, तो यह स्ट्रिंग कॉन्फैनेटेशन करता है। उदाहरण के लिए,
string firstName = "abc "; string lastName = "xyz"; // name = "abc xyz" string name = firstName + lastName;
हम निम्नलिखित तरीकों का उपयोग करके C ++ में बहुरूपता को लागू कर सकते हैं:
- कार्य अतिभार
- ऑपरेटर ओवरलोडिंग
- ओवरराइड करने का कार्य
- आभासी कार्य
C ++ फ़ंक्शन ओवरलोडिंग
C ++ में, हम एक ही नाम वाले दो कार्यों का उपयोग कर सकते हैं यदि उनके अलग-अलग पैरामीटर (या तो प्रकार या तर्कों की संख्या) हैं।
और, संख्या / प्रकार के तर्कों के आधार पर, विभिन्न कार्यों को कहा जाता है। उदाहरण के लिए,
// C++ program to overload sum() function #include using namespace std; // Function with 2 int parameters int sum(int num1, int num2) ( return num1 + num2; ) // Function with 2 double parameters double sum(double num1, double num2) ( return num1 + num2; ) // Function with 3 int parameters int sum(int num1, int num2, int num3) ( return num1 + num2 + num3; ) int main() ( // Call function with 2 int parameters cout << "Sum 1 = " << sum(5, 6) << endl; // Call function with 2 double parameters cout << "Sum 2 = " << sum(5.5, 6.6) << endl; // Call function with 3 int parameters cout << "Sum 3 = " << sum(5, 6, 7) << endl; return 0; )
आउटपुट
सम १ = ११ सम २ = १२.१ सम ३ = १ 2
यहां, हमने sum()
विभिन्न मापदंडों (संख्या / प्रकार के मापदंडों) के साथ 3 अलग-अलग फ़ंक्शन बनाए हैं । और, एक फ़ंक्शन कॉल के दौरान पारित तर्कों के आधार पर, एक विशेष sum()
कहा जाता है।
यह एक संकलन-समय का बहुरूपता है क्योंकि संकलक जानता है कि कार्यक्रम को संकलित करने से पहले कौन सा कार्य निष्पादित करना है।
अधिक जानने के लिए, हमारे C ++ फ़ंक्शन ओवरलोडिंग ट्यूटोरियल पर जाएं।
सी ++ ऑपरेटर ओवरलोडिंग
C ++ में, हम एक ऑपरेटर को तब तक अधिभारित कर सकते हैं जब तक कि हम उपयोगकर्ता-परिभाषित प्रकारों जैसे वस्तुओं या संरचनाओं पर काम कर रहे हैं।
हम इस तरह के रूप में बुनियादी प्रकार के लिए अधिक भार ऑपरेटर का उपयोग नहीं कर सकते हैं int
, double
आदि
ऑपरेटर ओवरलोडिंग मूल रूप से फ़ंक्शन ओवरलोडिंग है, जहां विभिन्न ऑपरेटर कार्यों में एक ही प्रतीक होता है, लेकिन विभिन्न ऑपरेंड होते हैं।
और, ऑपरेंड के आधार पर, विभिन्न ऑपरेटर कार्यों को निष्पादित किया जाता है। उदाहरण के लिए,
// C++ program to overload ++ when used as prefix #include using namespace std; class Count ( private: int value; public: // Constructor to initialize count to 5 Count() : value(5) () // Overload ++ when used as prefix void operator ++() ( value = value + 1; ) void display() ( cout << "Count: " << value << endl; ) ); int main() ( Count count1; // Call the "void operator ++()" function ++count1; count1.display(); return 0; )
आउटपुट
गणना: 6
यहां, हमने ++
ऑपरेटर को अधिभारित किया है, जो Count
कक्षा की वस्तुओं (इस मामले में ऑब्जेक्ट काउंट 1) पर संचालित होता है ।
हमने इस अतिभारित ऑपरेटर का उपयोग सीधे count1 ऑब्जेक्ट के मान चर को बढ़ाने के लिए किया है 1
।
यह एक संकलन-समय का बहुरूपता भी है ।
अधिक जानने के लिए, हमारे C ++ ऑपरेटर ओवरलोडिंग ट्यूटोरियल पर जाएं।
C ++ फ़ंक्शन ओवरराइडिंग
C ++ वंशानुक्रम में, हम बेस क्लास के साथ-साथ इसके व्युत्पन्न वर्गों में भी एक ही कार्य कर सकते हैं।
जब हम व्युत्पन्न वर्ग के ऑब्जेक्ट का उपयोग करके फ़ंक्शन को कॉल करते हैं, तो बेस क्लास में एक के बजाय व्युत्पन्न वर्ग के फ़ंक्शन को निष्पादित किया जाता है।
इसलिए, फ़ंक्शन को कॉल करने वाले ऑब्जेक्ट के आधार पर विभिन्न फ़ंक्शन निष्पादित किए जाते हैं।
इसे C ++ में फ़ंक्शन ओवरराइडिंग के रूप में जाना जाता है । उदाहरण के लिए,
// C++ program to demonstrate function overriding #include using namespace std; class Base ( public: virtual void print() ( cout << "Base Function" << endl; ) ); class Derived : public Base ( public: void print() ( cout << "Derived Function" << endl; ) ); int main() ( Derived derived1; // Call print() function of Derived class derived1.print(); return 0; )
आउटपुट
व्युत्पन्न कार्य
यहाँ, हम एक का इस्तेमाल किया है print()
में समारोह Base
में वर्ग और एक ही समारोह Derived
वर्ग
जब हम व्युत्पन्न ऑब्जेक्ट 1 print()
का उपयोग करते हैं Derived
, तो यह वर्ग के कार्य को निष्पादित करके print()
फ़ंक्शन को ओवरराइड करता है ।Base
print()
Derived
यह एक रनटाइम बहुरूपता है क्योंकि फ़ंक्शन कॉल संकलक द्वारा हल नहीं किया जाता है, बल्कि इसे रनटाइम में हल किया जाता है।
अधिक जानने के लिए, हमारे C ++ फ़ंक्शन ओवरराइडिंग ट्यूटोरियल पर जाएं।
C ++ वर्चुअल फ़ंक्शंस
C ++ में, यदि हम व्युत्पन्न वर्ग के किसी ऑब्जेक्ट को इंगित करने के लिए बेस क्लास के पॉइंटर का उपयोग करते हैं, तो हम फ़ंक्शन को ओवरराइड करने में सक्षम नहीं हो सकते हैं।
बेस क्लास में वर्चुअल फ़ंक्शंस का उपयोग करना सुनिश्चित करता है कि इन मामलों में फ़ंक्शन को ओवरराइड किया जा सकता है।
इस प्रकार, वर्चुअल फ़ंक्शन वास्तव में फ़ंक्शन ओवरराइडिंग के अंतर्गत आते हैं । उदाहरण के लिए,
// C++ program to demonstrate the use of virtual functions #include using namespace std; class Base ( public: virtual void print() ( cout << "Base Function" << endl; ) ); class Derived : public Base ( public: void print() ( cout << "Derived Function"
Output
Derived Function
Here, we have used a virtual function
print()
in the Base
class to ensure that it is overridden by the function in the Derived
class.
Virtual functions are runtime polymorphism.
To learn more, visit our C++ Virtual Functions tutorial.
Why Polymorphism?
Polymorphism allows us to create consistent code. For example,
Suppose we need to calculate the area of a circle and a square. To do so, we can create a
Shape
class and derive two classes Circle
and Square
from it.
In this case, it makes sense to create a function having the same name
calculateArea()
in both the derived classes rather than creating functions with different names, thus making our code more consistent.