Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में अर्ली बाइंडिंग और लेट बाइंडिंग

इस सेक्शन में हम देखेंगे कि C++ में अर्ली बाइंडिंग क्या है और लेट बाइंडिंग क्या है। बाइंडिंग का अर्थ है आइडेंटिफायर्स को पतों में बदलने की प्रक्रिया। प्रत्येक वेरिएबल और फ़ंक्शन के लिए यह बाइंडिंग की जाती है। फ़ंक्शन्स के लिए यह कंपाइलर द्वारा फ़ंक्शन कॉल को सही फ़ंक्शन डेफिनिशन से मिलान करना है। बाइंडिंग या तो कंपाइल टाइम पर या रनटाइम पर की जाती है।

अर्ली बाइंडिंग (कंपाइल टाइम पॉलीमॉर्फिज्म)

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

उदाहरण

#include <iostream>
using namespace std;

class Base {
public:
    void display() {
        cout << "बेस क्लास में" << endl;
    }
};

class Derived : public Base {
public:
    void display() {
        cout << "डेराइव्ड क्लास में" << endl;
    }
};

int main(void) {
    Base* base_pointer = new Derived;
    base_pointer->display();
    return 0;
}

आउटपुट

बेस क्लास में

व्याख्या: पॉइंटर बेस क्लास टाइप का है, इसलिए कंपाइल टाइम पर बेस क्लास का display() बाइंड होता है, भले ही ऑब्जेक्ट डेराइव्ड क्लास का हो।

लेट बाइंडिंग (रनटाइम पॉलीमॉर्फिज्म)

यह रनटाइम पॉलीमॉर्फिज्म है। इस प्रकार की बाइंडिंग में कंपाइलर कोड जोड़ता है जो रनटाइम पर ऑब्जेक्ट टाइप की पहचान करता है फिर कॉल को सही फ़ंक्शन डेफिनिशन से मिलान करता है। यह virtual फ़ंक्शन का उपयोग करके प्राप्त किया जाता है।

उदाहरण

#include <iostream>
using namespace std;

class Base {
public:
    virtual void display() {
        cout << "बेस क्लास में" << endl;
    }
};

class Derived : public Base {
public:
    void display() {
        cout << "डेराइव्ड क्लास में" << endl;
    }
};

int main() {
    Base* base_pointer = new Derived;
    base_pointer->display();
    return 0;
}

आउटपुट

डेराइव्ड क्लास में

व्याख्या: virtual कीवर्ड रनटाइम पर वास्तविक ऑब्जेक्ट टाइप के आधार पर सही फ़ंक्शन कॉल करने में सक्षम बनाता है।

तुलना तालिका

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

वर्चुअल फ़ंक्शन कैसे काम करता है

  • प्रत्येक क्लास जिसमें वर्चुअल फ़ंक्शन्स होते हैं, उसका एक vtable (वर्चुअल टेबल) होता है
  • प्रत्येक ऑब्जेक्ट में एक छिपा हुआ vptr (वर्चुअल पॉइंटर) होता है जो vtable को इंगित करता है
  • रनटाइम पर, vptr के माध्यम से सही फ़ंक्शन ढूंढा जाता है

सर्वोत्तम अभ्यास

  • बेस क्लास डिस्ट्रक्टर को हमेशा virtual बनाएं यदि क्लास को पॉलीमॉर्फिकली उपयोग किया जाना है
  • C++11 में override कीवर्ड का उपयोग करें ताकि कंपाइलर ओवरराइड त्रुटियां पकड़ सके
  • जब तक पॉलीमॉर्फिज्म की आवश्यकता न हो, वर्चुअल फ़ंक्शन्स से बचें (परफॉर्मेंस)
  1. - C++ में लोकल क्लास (Local Class)

    लोकल क्लास क्या है? एक फ़ंक्शन के अंदर घोषित क्लास को लोकल क्लास कहते हैं क्योंकि यह उस फ़ंक्शन के लिए स्थानीय (local) होती है। बेसिक उदाहरण #include <iostream> using namespace std; void func() { class LocalClass { }; } int main() { return 0; } नियम और प्रतिबंध लोकल क्लास का नाम

  1. - C++ में क्लासेस और ऑब्जेक्ट्स (Classes and Objects)

    क्लास क्या है? C++ की प्रमुख विशेषता जो OOPS अवधारणाओं का समर्थन करती है और उपयोगकर्ता-परिभाषित डेटा प्रकार है। क्लास ऑब्जेक्ट के लिए विनिर्देश (blueprint) प्रदान करती है और डेटा चर तथा डेटा मैनिपुलेट करने वाले फ़ंक्शंस को एक पैकेज में रखती है। क्लास परिभाषा class कीवर्ड से शुरू, फिर क्लास नाम, फि

  1. - C++ में फ्रेंड क्लास और फ़ंक्शन

    किसी क्लास का फ्रेंड फ़ंक्शन उस क्लास के स्कोप के बाहर परिभाषित होता है लेकिन उसे उस क्लास के सभी प्राइवेट और प्रोटेक्टेड मेंबर्स को एक्सेस करने का अधिकार होता है। भले ही फ्रेंड फ़ंक्शन के प्रोटोटाइप क्लास परिभाषा में दिखाई देते हैं, फ्रेंड मेंबर फ़ंक्शन नहीं होते। एक फ्रेंड एक फ़ंक्शन, फ़ंक्शन टेम