সতর্কতা: কনস্ট্রাক্টর বা ডिस्ट্রাক্টর থেকে ভার্চুয়াল ফাংশন কল করা বিপজ্জনক এবং এড়ানো উচিত। কারণ ডেরাইভড ক্লাসের ভার্চুয়াল ফাংশন কল না হয়ে বেস ক্লাসেরটা কল হয়।
কারণ
C++-এ প্রতিটি ক্লাস নিজের ভার্চুয়াল মেথড টেবিল (vtable) কনস্ট্রাক্টর এন্ট্রি করার আগে তৈরি করে। বেস ক্লাসের কনস্ট্রাক্টর চলাকালীন ডেরাইভড ক্লাসের vtable এখনো তৈরি হয়নি। সুতরাং ভার্চুয়াল কল বেস ক্লাসের ভার্সনে যায়।
উদাহরণ
#include <iostream>
using namespace std;
class Base {
public:
Base() { f(); }
virtual void f() { cout << "Base" << endl; }
};
class Derived : public Base {
public:
Derived() : Base() {}
virtual void f() { cout << "Derived" << endl; }
};
int main() {
Derived d;
return 0;
}
আউটপুট
Base
সমাধান: ইনিশিয়ালাইজেশন ফাংশন (init()) আলাদা করে কল করুন, বা ফ্যাক্টরি ফাংশন ব্যবহার করুন।