कन्स्ट्रक्टर या डिस्ट्रक्टर से वर्चुअल फंक्शंस को कॉल करना खतरनाक है और जब भी संभव हो इससे बचना चाहिए। ऐसा इसलिए है क्योंकि आप जिस वर्चुअल फ़ंक्शन को कॉल करते हैं उसे बेस क्लास से कॉल किया जाता है, न कि व्युत्पन्न वर्ग से।
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