ভার্চুয়াল ফাংশন কী?
ভার্চুয়াল ফাংশন হলো বেস ক্লাসে ডিক্লেয়ার করা একটি ফাংশন যা ডেরাইভড ক্লাসে ওভাররাইড করা যায়। এটি রানটাইমে ডাইনামিক ডিসপ্যাচ (dynamic dispatch) বা লেট বাইন্ডিং (late binding) সক্ষম করে। বেস ক্লাস পয়েন্টার দিয়ে ডেরাইভড ক্লাসের ফাংশন কল করা যায়।
ম্যাকানিজম: vtable এবং vptr
- প্রতিটি ক্লাস যাতে ভার্চুয়াল ফাংশন থাকে, তার একটি vtable (virtual table) থাকে — এটি ফাংশন পয়েন্টারগুলোর একটি স্ট্যাটিক অ্যারে।
- প্রতিটি অবজেক্টে একটি হিডেন vptr (vtable pointer) থাকে যা তার ক্লাসের vtable-কে পয়েন্ট করে।
- যখন ভার্চুয়াল ফাংশন কল করা হয়, কম্পাইলার কোড জেনারেট করে:
obj->vptr->vtable[slot]()
উদাহরণ কোড
#include <iostream>
using namespace std;
class Base {
public:
virtual void show() {
cout << "In Base\n";
}
virtual ~Base() {} // Virtual destructor important!
};
class Derived : public Base {
public:
void show() override {
cout << "In Derived\n";
}
};
int main() {
Derived d;
Base* b = &d; // Base pointer to Derived object
b->show(); // Runtime: Derived::show() কল হবে
return 0;
}
আউটপুট
In Derived
খুব জরুরি নোট
- Virtual Destructor: বেস ক্লাসে ভার্চুয়াল ডেস্ট্রাক্টর না থাকলে, বেস পয়েন্টার দিয়ে ডিলিট করলে ডেরাইভড ডেস্ট্রাক্টর কল হবে না → মেমরি লিক।
- Override কীওয়ার্ড: C++11 থেকে `override` ব্যবহার করলে কম্পাইল টাইমে ভুল ধরা যায়।
- Pure Virtual: `virtual void foo() = 0;` → অ্যাবস্ট্র্যাক্ট ক্লাস বানায়।
ব্যাখ্যা
ভার্চুয়াল ফাংশন পলিমরফিজম (polymorphism) এর মূল ভিত্তি। এটি অবজেক্ট-অরিয়েন্টেড ডিজাইনে রানটাইমে আচরণ পরিবর্তন করার ক্ষমতা দেয়। কম্পাইলার phtables এবং vptr ব্যবহার করে এটি ইমপ্লিমেন্ট করে, যা কিছু ওভারহেড যোগ করে কিন্তু ফ্লেক্সিবিলিটি দেয়।