इस सेक्शन में हम देखेंगे कि 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कीवर्ड का उपयोग करें ताकि कंपाइलर ओवरराइड त्रुटियां पकड़ सके - जब तक पॉलीमॉर्फिज्म की आवश्यकता न हो, वर्चुअल फ़ंक्शन्स से बचें (परफॉर्मेंस)