BCA / B.Tech 10 min read

Polymorphism in Hindi

Polymorphism in C++ in Hindi | C++ में बहुरूपता  हिंदी में :


  • प्रोग्रामिंग की दुनिया में, बहुरूपता (Polymorphism) एक महत्वपूर्ण अवधारणा है, विशेषकर ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (OOP) में। इसका शाब्दिक अर्थ है "अनेक रूपों में होना"। 
  • बहुरूपता का उपयोग करके हम एक ही नाम के फ़ंक्शन्स या ऑब्जेक्ट्स को विभिन्न प्रकार से उपयोग कर सकते हैं। यानी, एक ही कार्य को कई अलग-अलग तरीकों से किया जा सकता है, जो कि इसके आधार पर अलग-अलग परिणाम देता है।
  • बहुरूपता (Polymorphism) ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग का एक शक्तिशाली उपकरण है, जो हमें एक ही नाम से विभिन्न प्रकार के कार्य करने की सुविधा प्रदान करता है। 
  • यह प्रोग्राम को अधिक लचीला और पुन: प्रयोज्य बनाता है।  चाहे वह संकलन समय पर हो या रनटाइम पर, बहुरूपता कोड को अधिक संगठित और कुशल बनाती है।
  • बहुरूपता का मुख्य उद्देश्य है कोड को सरल और लचीला बनाना, ताकि उसे बार-बार संशोधित किए बिना आसानी से पुनः उपयोग किया जा सके।


 C++ जैसी OOP भाषाओं में बहुरूपता की दो मुख्य प्रकारें होती हैं:

  • संकलन समय बहुरूपता (Compile-time Polymorphism)
  • रनटाइम बहुरूपता (Runtime Polymorphism)

आइए हम इन दोनों प्रकारों को विस्तार से समझते हैं।

Compile-time Polymorphism in C++ in Hindi | संकलन समय बहुरूपता :

संकलन समय बहुरूपता को स्थैतिक बहुरूपता (Static Polymorphism) भी कहा जाता है। इसका मतलब यह है कि किसी फंक्शन या ऑपरेटर का कौन-सा रूप इस्तेमाल किया जाएगा, 
यह निर्णय संकलन (Compilation) के समय ही हो जाता है। इसे प्राप्त करने के लिए फ़ंक्शन ओवरलोडिंग (Function Overloading) और ऑपरेटर ओवरलोडिंग (Operator Overloading) का उपयोग किया जाता है।

(i) फ़ंक्शन ओवरलोडिंग (Function Overloading)

फ़ंक्शन ओवरलोडिंग तब होती है जब एक ही नाम के कई फ़ंक्शन होते हैं, लेकिन उनके पैरामीटर्स अलग-अलग होते हैं। इससे प्रोग्राम को लचीला बनाया जा सकता है, क्योंकि हमें अलग-अलग कार्यों के लिए नए फ़ंक्शन नाम बनाने की आवश्यकता नहीं होती।

उदाहरण:

#include<iostream>
using namespace std;

// फ़ंक्शन ओवरलोडिंग
int add(int a, int b) {
    return a + b;
}

float add(float a, float b) {
    return a + b;
}

int main() {
    cout << "Sum of integers: " << add(5, 10) << endl;
    cout << "Sum of floats: " << add(5.5f, 10.5f) << endl;

    return 0;
}

यहां, add नाम के दो फ़ंक्शन हैं, एक इंटिजर्स (int) के लिए और दूसरा फ्लोट (float) के लिए। संकलन के समय, यह तय किया जाता है कि किस फ़ंक्शन को कॉल करना है, यानी किस पैरामीटर के प्रकार का उपयोग हो रहा है।

(ii) ऑपरेटर ओवरलोडिंग (Operator Overloading)

ऑपरेटर ओवरलोडिंग का उपयोग करके हम किसी मौजूदा ऑपरेटर का व्यवहार बदल सकते हैं, ताकि वह हमारे कस्टम डेटा प्रकारों पर भी काम कर सके। C++ में हम अधिकांश ऑपरेटरों को ओवरलोड कर सकते हैं।

उदाहरण:

#include<iostream>
using namespace std;

class Complex {
public:
    float real, imag;

    Complex(float r = 0, float i = 0) {
        real = r;
        imag = i;
    }

    // ऑपरेटर ओवरलोडिंग
    Complex operator + (Complex const &obj) {
        Complex result;
        result.real = real + obj.real;
        result.imag = imag + obj.imag;
        return result;
    }
};

int main() {
    Complex c1(3.5, 2.5), c2(1.5, 3.5);
    Complex c3 = c1 + c2;  // + ऑपरेटर का ओवरलोडिंग
    cout << "Real: " << c3.real << " Imaginary: " << c3.imag << endl;

    return 0;
}
यहां, हमने + ऑपरेटर को ओवरलोड किया है ताकि यह Complex नामक क्लास के ऑब्जेक्ट्स को जोड़ सके।

Runtime Polymorphism in C++ in Hindi | रनटाइम बहुरूपता :

रनटाइम बहुरूपता को गतिशील बहुरूपता (Dynamic Polymorphism) भी कहा जाता है। यह बहुरूपता प्रोग्राम के निष्पादन (execution) के समय होती है। इसे प्राप्त करने के लिए वर्चुअल फंक्शन (Virtual Function)
 का उपयोग किया जाता है। यह तब उपयोगी होता है जब किसी बेस क्लास के द्वारा जारी किए गए फ़ंक्शन्स को डेराइव्ड क्लास द्वारा अलग तरह से परिभाषित किया जाता है।

(i) वर्चुअल फंक्शन (Virtual Function)

वर्चुअल फंक्शन वह फ़ंक्शन होता है जिसे बेस क्लास में घोषित किया जाता है लेकिन डेराइव्ड क्लास में इसे ओवरराइड किया जाता है। वर्चुअल फंक्शन की मदद से हम किसी डेराइव्ड क्लास
 के ऑब्जेक्ट को बेस क्लास के पॉइंटर से रेफर करते हुए भी डेराइव्ड क्लास के फ़ंक्शन को कॉल कर सकते हैं।

उदाहरण:

#include<iostream>
using namespace std;

class Base {
public:
    virtual void show() {
        cout << "Base class show function" << endl;
    }
};

class Derived : public Base {
public:
    void show() override {
        cout << "Derived class show function" << endl;
    }
};

int main() {
    Base* basePtr;
    Derived derivedObj;

    basePtr = &derivedObj;

    // वर्चुअल फंक्शन के कारण डेराइव्ड क्लास का फ़ंक्शन कॉल होगा
    basePtr->show();

    return 0;
}
यहां, बेस क्लास का पॉइंटर basePtr डेराइव्ड क्लास के ऑब्जेक्ट को रेफर कर रहा है, लेकिन वर्चुअल फंक्शन के कारण डेराइव्ड क्लास का show फ़ंक्शन कॉल हुआ।

Advantages of Polymorphism in C++ in Hindi | बहुरूपता के लाभ :

  • लचीलापन (Flexibility): बहुरूपता प्रोग्राम को लचीला बनाती है, क्योंकि एक ही इंटरफ़ेस से विभिन्न प्रकार के कार्य किए जा सकते हैं।
  • कोड का पुन: उपयोग (Code Reusability): एक बार लिखे गए कोड को बार-बार उपयोग किया जा सकता है। फ़ंक्शन ओवरलोडिंग और ऑपरेटर ओवरलोडिंग से कोड को दोहराने की आवश्यकता नहीं होती।
  • डायनामिक बाइंडिंग (Dynamic Binding): रनटाइम बहुरूपता डायनामिक बाइंडिंग की सुविधा प्रदान करती है, जिसमें किसी ऑब्जेक्ट का प्रकार रनटाइम पर ही तय किया जाता है।
  • कोड को सरल बनाना (Simplifying Code): बहुरूपता कोड को सरल और पढ़ने में आसान बनाती है, क्योंकि एक ही नाम से विभिन्न प्रकार के कार्यों को नियंत्रित किया जा सकता है।
Disadvantages of Polymorphism in C++ in Hindi | बहुरूपता की सीमाएँ :

  • जटिलता (Complexity): रनटाइम बहुरूपता के कारण कोड की जटिलता बढ़ सकती है, विशेषकर जब विभिन्न डेराइव्ड क्लासेस में फंक्शन ओवरराइडिंग का उपयोग हो।
  • डिबगिंग में कठिनाई (Difficulty in Debugging): डायनामिक बाइंडिंग के कारण डिबगिंग करना मुश्किल हो सकता है क्योंकि फंक्शन कॉल रनटाइम पर तय होते हैं।
  • अधिक मेमोरी उपयोग (More Memory Usage): वर्चुअल फंक्शन टेबल (Virtual Function Table) के कारण अतिरिक्त मेमोरी का उपयोग होता है।
  • प्रदर्शन में कमी (Performance Overhead): रनटाइम पर फंक्शन का चयन करने के कारण थोड़ी बहुत प्रदर्शन की हानि हो सकती है।