Polymorphism, Object oriented programming के सबसे उपयोगी गुणों में से एक है।
Polymorphism शब्द Greek के दो शब्दों "Poly" तथा "Morphism" से मिलकर बना है।
' Poly' का अर्थ Many तथा Morphism का अर्थ है Forms अत: Polymorphism का अर्थ है "Many form"(कई रूप)।
आइए इसे एक उदाहरण से समझे जैसे एक महिला अपने घर में बेटी या पत्नी के समान व्यवहार करेगी, वहीं अपने Clinic में Patient के साथ Doctor के समान व्यवहार करेगी
अगर वह Market गई है तो एक Customer के समान व्यवहार करेगी अतः हमने देखा कि महिला एक ही है लेकिन अलग अलग स्थितियों में उसकी भूमिका और व्यवहार विभिन्न प्रकार से है यही Polymorphism का Concept है।
C++ में Polymorphism तब होती है जब एक ही object या function का व्यवहार अलग-अलग संदर्भों में भिन्न होता है।
C++ में Polymorphism आपको विभिन्न Classes की Objects के साथ ऐसे व्यवहार करने की अनुमति देती है जैसे कि वे एक ही Base class की Objects हों।
यह एक ही function या method को विभिन्न प्रकार की Objects के साथ काम करने की अनुमति देता है।
Polymorphism को मुख्यत: Function overloading, Operator overloading और Virtual functions के माध्यम से प्राप्त किया जाता है।
यह आपके Code को लचीला तथा फिर से उपयोग करने लायक बनाता है क्योंकि आप एक सामान्य Code लिखते है जो विभिन्न प्रकार के Objects के साथ कार्य करते है और प्रत्येक Object अपने स्वयं के विशिष्ट विवरणों को handle करते हैं।
Types of polymorphism in C++ in Hindi
C++ में Polymorphism दो प्रकार के होते हैं
1) Compile time (Static) polymorphism
2) Run-time(Dynamic )polymorphism
Compile time (Static) polymorphism
C++ में Compile-time polymorphism का मतलब यह है कि कोई function या operator आपके द्वारा दिए गए Arguments के प्रकार या उसकी संख्या के आधार पर अलग-अलग कार्य कर सकता है।
जब आप Code को Compile करते हैं तब Compiler यह निर्णय लेता है कि कौन सा function या operator को Use करना है।
Compiler का, यह निर्णय कि, कौन से function या operator को Use करना है Compiler time में लिया जाता है न कि Runtime में इसलिए इसे Compile time polymorphism कहते हैं।
यह एक ही function या operator को उसे प्राप्त होने वाले Input के आधार पर विभिन्न कार्यों को Handle करने की अनुमति देता है।
Compile time polymorphism को निम्न प्रकार से प्राप्त किया जा सकता है
1) Function overloading
2) Operator overloading
Function overloading
जब कई functions को एक ही नाम से लेकिन अलग अलग Parameters के साथ Define किया जाता है तब उसे Function overloading कहते हैं।
Function को उसके Arguments के प्रकार तथा उसकी संख्या को बदलकर Overloaded किया जाता है
अर्थात Function overloading में Function का नाम समान होना चाहिए और उनके Parameters या Arguments अलग अलग होना चाहिए
Function overloading के लिए कुछ विशिष्ट नियम होते है जिसे एक Function को Overload करते समय, अवश्य ही अनुसरण करना होता है।
Program for Function overloading
#include<iostream>
using namespace std;
class Message{
public:
// Overloaded functions
void display(int i) {
cout << "I am an Integer: " << i << endl;
}
void display(double d) {
cout << "I am a double: " << d << endl;
}
void display (const string &s) {
cout << "I am string: " << s << endl;
}
};
int main() {
Message m;
m.display (15); //first function
m. display(3.5); //Second overloaded function
m.display("Computerehub");//Third overloaded function
return 0;
};
Output:
I am an Integer: 15
I am a double: 3.5
I am string: Computerehub
Explanation:
1) Class को Define करना:
`Message` class के पास तीन Overloaded `display` functions है।
प्रत्येक के लिए विभिन्न Parameters types जैसे`int`, `double`, और `string`, Use किया गया है।
2) Function Overloading:
1) display(int i)
यह एक Integer data को display करता है
2) display(int double)
यह एक double data को display करता है
3) display (const string &s)`
यह एक string data को display करता है
3) Main Function:
Message class का एक object 'm' बनाया गया है जिसके द्वारा ऊपर के तीनो Overloaded function को Call किया गया है।
4) Output:
और अंत में हमे display function के द्वारा प्रत्येक प्रकार के Data का output मिलता है।
Operator overloading
C++ में Operator overloading, Operators जैसे +,-,* आदि Custom data types के साथ के साथ कैसे कार्य करता है इसे Redefine करने की अनुमति देता है।
यह सुविधा Operators (जैसे `+` या `-`) को Objects के साथ सरल और तार्किक तरीके से काम करने की अनुमति देता है जो आपके Code को पढ़ना और उपयोग करना सरल बनाता है।
जब आप किसी Operator को Overload करते हैं, तो आप अपनी Class में एक विशेष Member function या Friend function बनाते हैं जो Program को यह बताता है कि जब उस Operator का Use Class की Objects पर किया जाता है तो क्या करना है।
किसी Operator को Overload करने का Syntax एक Regular function को परिभाषित करने के समान है, लेकिन इसमें Operator Keyword का उपयोग किया जाता है।
Program for Operator overloading
#include<iostream>
using namespace std;
class Test{
int x, y;
public:
void get(int a, int b) {
x = a;
y = b;
}
void display();
void operator++();
};
void Test::display() {
cout << "X = " << x << endl;
cout << "Y = " << y << endl;
}
void Test::operator++() {
x = ++x;
y = ++y;
}
int main() {
Test t1;
t1.get(5, 10);
t1.display();
++t1;
t1. display();
++t1;
t1. display();
return 0;
}
Output:
X = 5
Y = 10
X = 6
Y = 11
X = 7
Y = 12
Explaination:
1) `Test` class के पास दो Private integer members, `x` और `y` है।
2) `get` function, `x` और `y` के लिए Value set करता है।
3)`display` function x` और `y` की Values को print करता है।
4)`operator++()` function `x` और`y` में 1 Increment करने के लिए `++` operator को overload करता है।
5) `main()`, Test` class का एक object(t1) बनाया जाता है और उसे get का Use करके 5 और 10 Values के साथ Initialize किया जाता है।
6) `displayData` के Use करके Initial Value को Display किया जाता है।
7) `++t1` statement `x` और `y` में 1 Increment करता है।
8) प्रत्येक Increment के बाद update values को Display किया जाता है।
Run-time (Dynamic) polymorphism
Run-time polymorphism में, Program execution के दौरान Program यह तय करता है कि Actual object के प्रकार के आधार पर किस function को Call करना है, चूकि
उचित Function को call करने का निर्णय Runtime के दौरान होता है न कि Compile time पर इसलिए इसे Runtime polymorphism या Dynamic या Late binding भी कहा जाता है।
इस प्रकार का Polymorphism को
Virtual functions और function overriding के द्वारा Execute किया जाता है। Runtime polymorphism के सभी Methods Runtime के दौरान ही Invoke होते हैं।
Runtime polymorphism को जटिल समस्याओं से निपटने के लिए बेहतर माना जाता है क्योंकि या Program के Run होने के दौरान ही यह निर्णय लेता है कि कौन सा Methods का Use करना है, न कि Program को लिखते समय।
Run time polymorphism को निम्न प्रकार से प्राप्त किया जा सकता है
1) Function overriding
2) Virtual function
Function Overriding
C++ में Function overriding एक Derived class को किसी function का खुद का Version बनाने की अनुमति देता है जो पहले से Base class में रहता है।
इसका मतलब है कि Derived class, Base class के function में बदलाव कर सकता है या उसमें जोड़ सकता है।
Program for Function overriding
#include<iostream>
using namespace std;
class Fruits{
public:
virtual void displayColor() {
cout << "The fruit has different colors " << endl;
}
};
class Apple : public Fruits{
public:
void displayColor() {
cout << "Apple's color is red." << endl;
}
};
class Grape: public Fruits{
public:
void displayColor() {
cout << "Grape's color is green." << endl;
}
};
int main() {
Fruits* f;
Apple a;
Grape g;
f = &a;
f->displayColor(); // Calls Apple's displayColor function
f = &g;
f->displayColor(); // Calls Grape's displayColor function
return 0;
};
Output:
Apple's color is red.
Grape's color is green.
Virtual function
C++ में एक Virual function, Base class का function है जिससे आप अपेक्षा करते है कि इसे Derived classes में बदला जा सकता है। अर्थात Base class के इस Virtual function को Derived class में पुन: परिभाषित किया जा सकता है, जिससे विभिन्न Derived classes में Virtual function के अलग अलग Versions हो सकतें है।
Difference between Compile-time and Run-time polymorphism in C++ in Hindi
1) Compile-Time Polymorphism:
इसमे कौन सा Function को Call करना है यह निर्णय Compile time में लिया जाता है
Run-Time Polymorphism:
इसमें कौन सा Function को Call करना है यह निर्णय Run-Time में लिया जाता है
2) Compile-Time Polymorphism:
Compile-Time Polymorphism को Function overloading, Operator overloading तथा Template का Use करके Implement किया जाता है।
Run-Time Polymorphism:
इसे inheritance और virtual functions का Use करके Implement किया जाता है।
3) Compile -Time Polymorphism:
यह कम flexible होता है क्योंकि function call को Compile time पर fix किया जाता है
Run-Time Polymorphism:
यह ज्यादा flexible होता है क्योंकि function call को Run time पर Object के आधार पर निर्धारित किया जाता है।
4) Compile-Time Polymorphism:
यह तेज होता है क्योंकि Program के Run होने से पहले ही function को call करने का निर्णय लिया जाता है
Run-Time Polymorphism:
यह धीमा होता है क्योंकि Run time पर एक सही function को Call करने का अतिरिक्त भार रहता है।
5) Compile-Time Polymorphism:
इसे Static polymorphism के नाम से भी जाना जाता है
Run-Time Polymorphism:
इसे Dynamic polymorphismके नाम से भी जाना जाता है
6) Compile-Time Polymorphism:
इसमे कम Memory use किया जाता है क्योंकि सब कुछ पहले से ही resolve रहता है।
Run-Time Polymorphism:
Pointer तथा Virtual table के लिए ज्यादा Memory Use किया जा सकता है
7) Compile-Time polymorphism:
इसमें Function overriding शामिल नहीं है
Run-Time polymorphism:
इसमें Function overriding शामिल है
8) Compile-Time Polymorphism:
Program के run होने के दौरान अतिरिक्त कार्य नहीं रहता है
Run-Time Polymorphism:
Program को Run होते समय यह पता लगाने के लिए अतिरिक्त काम करना पड़ता है कि किस function को Call करना है।
9) Compile -Time polymorphism:
इसमें Object का निर्माण Compile time में होता है।
Run -Time polymorphism:
इसमें Object का निर्माण Run time में होता है
10) Compile-Time Polymorphism:
Errors को Program के Run होने से पहले पकड़ा जाता है जिससे इसे Debug(fix )करना सरल हो जाता है।
Run-Time Polymorphism:
Errors, Program के Run होने के दौरान ही दिखाई देता है जिससे इसे Debug करना कठिन हो जाता है
0 टिप्पणियाँ