Early Binding and Late Binding in C++ – Virtual Functions

Early Binding and Late Binding in C++: पिछले Post के आधार पर आप सोंच सकते हैं कि Compiler एक ही प्रकार के Statement के Response में ये कैसे तय करता है कि उसे किस Class के Member Function को Execute करना है?

पिछले Post के पहले उदाहरण में हमने देखा कि Compiler हमेंशा Base Class के Member Function को ही Execute करता है लेकिन दूसरे उदाहरण में Compiler को ये पता नहीं होता है कि Pointer ptr में किस Class के Object का Address है। इसमें DerivedClass1 के Object का भी Address हो सकता है और DerivedClass2 के Object का भी। इसलिए Compiler Compile Time में ये तय नहीं कर पाता है, कि उसे किस Class के Member Function को Execute करना है।

अत: Compiler Compile Time में किसी प्रकार का निर्णय नहीं लेता, बल्कि Program के Run Time में ये तय करता है कि उसे किस Class के Member Function को Execute करना है।

Program के Run Time में जब Function Call Execute होता है, तब Compiler Object ptr में Stored Address के आधार पर ये पता लगाता है कि Pointer ptr में किस Class के Object का Address है। Object की Class के आधार पर ही Compiler DerivedClass1 :: show() Function को Execute करता है या DerivedClass2 :: show() को Execute करता है।

इस प्रकार से किसी Object के लिए Call किए गए किसी Function को किस Class से Execute करना है, जब इसका निर्णय Compiler Program के Run Time में लेता है, तब इस प्रक्रिया को Late Binding या Dynamic Binding कहते हैं। Function Call को Appropriate Function से Connect करना Binding कहलाता है। जब Function Normal Way में Compilation के दौरान Function Call से Connect होता है, तो इस प्रक्रिया को Static Binding या Early Binding कहते हैं। Late Binding में Early Binding की तुलना में लगभग 10% अधिक समय लगता है लेकिन Late Binding से Program की Flexibility व Power कई गुना बढ जाती है।

एक ऐसा सामान्‍य Object जिसकी Class का Member Function Virtual नहीं होता है, वह Object जब Memory में Store होता है, तब उस Object में केवल उसी के Data होते हैं। जब उस Object के लिए कोई Member Function Call किया जाता है, तब Compiler उस Object के Address को उसके Member Function में Pass कर देता है। Object का ये Address उस Object के Member Function में this Pointer में Store हो जाता है।

this Pointer में Stored Object के Pointer का प्रयोग Member Function Object के Data को Invisibly Access व Manipulate करने के लिए करता है। किसी Object के लिए जितनी बार भी कोई Member Function Invoke होता है, उतनी ही बार यानी हर बार Compiler उस Object के Address को Call हो रहे Member Function के this Pointer में Store कर देता है।

ये this Pointer Object में Store नहीं होता है और ना ही किसी प्रकार की कोई Memory लेता है। this Pointer ही Object व उसके Normal Member Function के बीच का एक जरूरी Connection होता है। लेकिन जब हम Virtual Functions के बारे में बात करते हैं, तब थोडी जटिलता आ जाती है।

जब किसी Virtual Member Function वाली Class से कोई अन्‍य Class Derive की जाती है, तब Compiler एक Array के रूप में एक Functions के Addresses की एक Table Create करता है, जिसे Virtual Table कहते हैं। अलग-अलग Compilers के आधार पर इस Virtual Table को vtable या vtbl कहते हैं।

हमारे दूसरे उदाहरण में DerivedClass1 व DerivedClass2 दोनों Classes में उनके स्वयं के Virtual Tables हैं। Class के हर Virtual Function की Entry उस Class की हर Virtual Table में होती है। चूंकि DerivedClass1 व DerivedClass2 दोनों ही Classes BaseClass से Derived हैं, इसलिए इन दोनों ही Classes की Virtual Table में Same Virtual Function की Entry होती है और सभी Entries का क्रम भी दोनों Tables में एक समान होता है। लेकिन दोनों Classes के लिए Tables के Addresses भिन्न होते हैं।

DerivedClass1 व DerivedClass2 के जितने भी Objects Create होते हैं, उन सभी में उनके Data के अलावा एक Extra Pointer होता है। ये तथ्; उन सभी Objects पर लागू होता है, जिनकी Class में एक या एक से अधिक Virtual Functions होते हैं। इस Pointer को vptr या vpointer कहते हैं। इस Pointer में उसकी Class के Virtual Table का Address होता है। इसलिए वे Objects जिनकी Class में Virtual Functions होते हैं, सामान्‍य Objects की तुलना में Size में थोडे बडे होते हैं।

हमारे उदाहरण के आधार पर जब एक Virtual Function Call होता है, तब Compiler ये तय नहीं करता कि उसे किस Class के Member Function को Call करना है बल्कि Compiler ऐसे Codes Create करता है, जो सबसे पहले Object के vptr के Content को Check करता है।

क्योंकि इसमें Class के vtable का Address होता है। फिर vptr के आधार पर Compiler Class के vtable को प्राप्त करता है और उस vtable के Member Functions के Addresses की List में से Appropriate Member Function के Address को Choose करके उस Member Function को Execute कर देता है।

परिणाम स्वरूप जब हम Virtual Functions की बात करते हैं, तब Object ये तय करता है कि उसे किस Member Function को Call करना है ना कि Compiler ये तय करता है कि Object के लिए किस Member Function को Call करना है।

हमने जो पिछले दोनों उदाहरण देखे हैं, वे Realistic नहीं हैं। हमने इन दोनों उदाहरण Programs में जो Virtual Functions वाले Standalone “Pointers to Objects” Variables Create किए हैं, वास्तव में वे Standalone Create नहीं होते हैं बल्कि एक Array में Create होते हैं। हमारा अगला उदाहरण अधिक Realistic Situation पर आधारित है। (Early Binding and Late Binding in C++ – StackExchange)

CPP Programming Language in Hindiये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook C++ Programming Language in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

C++ Programming Language in Hindi | Page: 666 | Format: PDF

BUY NOW GET DEMO REVIEWS