কম্পিউটার টিউটোরিয়াল

C++-এ কনস্ট্রাক্টর (Constructor)-এ ভার্চুয়াল ফাংশন কল করা

সতর্কতা: কনস্ট্রাক্টর বা ডिस्ट্রাক্টর থেকে ভার্চুয়াল ফাংশন কল করা বিপজ্জনক এবং এড়ানো উচিত। কারণ ডেরাইভড ক্লাসের ভার্চুয়াল ফাংশন কল না হয়ে বেস ক্লাসেরটা কল হয়।

কারণ

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()) আলাদা করে কল করুন, বা ফ্যাক্টরি ফাংশন ব্যবহার করুন।

  1. প্যারালেলোগ্রামের ভিতরে ত্রিভুজের ক্ষেত্রফল C++-এ

  2. C++-এ main ফাংশন কি নিজেকে কল করতে পারে?

  3. C++-এ ডেরাইভড ক্লাস ফাংশন থেকে প্যারেন্ট ক্লাস ফাংশন কল করা

  4. C++-এ ভার্চুয়াল ডিস্ট্রাক্টর (Virtual Destructor) কখন ব্যবহার করা উচিত?