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