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