C++-এ ভার্চুয়াল ফাংশন ব্যবহার করে বেস ক্লাস পয়েন্টারের একটি লিস্ট তৈরি করা যায় এবং যেকোনো ডেরাইভড ক্লাসের মেথড কল করা যায় সেটির কিন্ড जाने বিনা। ভার্চুয়াল ফাংশন লেট রিজল্ভ হয়, রানটাইমে।
ভার্চুয়াল ফাংশনের প্রধান ব্যবহার হলো রানটাইম পলিমরফিজম অর্জন। ইনলাইন ফাংশন কোডের এফিশিয়েন্সি বাড়াতে ব্যবহৃত হয়। ইনলাইন ফাংশনের কোড কম্পাইল টাইমে ইনলাইন ফাংশন কলের পয়েন্টে সাবস্টিটিউট হয়ে যায়, যতবার ইনলাইন ফাংশন কল করা হয়।
যখন ভার্চুয়াল ফাংশন বেস ক্লাস রেফারেন্স বা পয়েন্টার দিয়ে কল করা হয়, তখন সেটি ইনলাইন করা যায় না, কিন্তু যখন অবজেক্ট দিয়ে রেফারেন্স বা পয়েন্টার ছাড়া কল করা হয়, তখন সেটি ইনলাইন করা যায় কারণ কম্পাইলার কম্পাইল টাইমে অবজেক্টের একজেক্ট ক্লাস জানতে পারে।
উদাহরণ কোড
#include <iostream>
using namespace std;
class B {
public:
virtual void s() {
cout << " In Base \n";
}
};
class D: public B {
public:
void s() {
cout << "In Derived \n";
}
};
int main(void) {
B b;
D d; // ক্লাস D-এর অবজেক্ট
B *bptr = &d; // B* টাইপের পয়েন্টার d-কে পয়েন্ট করছে
b.s(); // ইনলাইন করা যাবে কারণ s() অবজেক্ট দিয়ে কল হয়েছে
bptr->s(); // প্রিন্ট করবে "D::s() called"
// ইনলাইন করা যাবে না, কারণ ভার্চুয়াল ফাংশন পয়েন্টার দিয়ে কল হয়েছে।
return 0;
}আউটপুট
In Base In Derived