कंस्ट्रक्टर या डिस्ट्रक्टर से वर्चुअल फ़ंक्शन्स को कॉल करना खतरनाक है और जब भी संभव हो इससे बचा जाना चाहिए। ऐसा इसलिए है क्योंकि आप जिस वर्चुअल फ़ंक्शन को कॉल करते हैं, वह बेस क्लास से कॉल होता है न कि डेराइव्ड क्लास से।
C++ में हर क्लास अपने स्वयं के निर्माण में प्रवेश करने से पहले वर्चुअल मेथड टेबल का अपना संस्करण बनाता है। इसलिए कंस्ट्रक्टर में वर्चुअल मेथड की कॉल बेस क्लास के वर्चुअल मेथड को कॉल करेगी। या यदि उस स्तर पर इसका कोई कार्यान्वयन नहीं है, तो यह एक प्योर वर्चुअल मेथड कॉल उत्पन्न करेगा। एक बार बेस पूरी तरह से निर्मित हो जाने पर, कंपाइलर डेराइव्ड क्लास बनाना शुरू करता है, और मेथड पॉइंटर्स को डेराइव्ड क्लास के कार्यान्वयन की ओर ओवरराइड करता है। उदाहरण के लिए, यदि आपके पास कोड है:
उदाहरण
#include<iostream> using namespace std; class Base { public: Base() { f(); } virtual void f() { std::cout << "Base" << std::endl; } }; class Derived : public Base { public: Derived() : Base() {} virtual void f() { std::cout << "Derived" << std::endl; } }; int main() { Derived d; return 0; }
आउटपुट
यह आउटपुट देगा:
Base