নিচের টেবিলে ভার্চুয়াল এবং পিউর ভার্চুয়াল ফাংশনের পার্থক্য দেখানো হলো -
| ভার্চুয়াল ফাংশন | পিউর ভার্চুয়াল ফাংশন |
|---|---|
| ভার্চুয়াল ফাংশনের ক্লাসে ডেফিনিশন থাকে। | পিউর ভার্চুয়াল ফাংশনের কোনো ডেফিনিশন নেই। |
| ডিক্লেরেশন: virtual funct_name(parameter_list) { ... }; | ডিক্লেরেশন: virtual funct_name(parameter_list) = 0; |
| এটার ডেরাইভড ক্লাসের কোনো কনসেপ্ট নেই। | যদি একটি ক্লাসে কমপক্ষে একটি পিউর ভার্চুয়াল ফাংশন থাকে, তবে সেটি অ্যাবস্ট্র্যাক্ট ডিক্লেয়ার করা হয়। |
| প্রয়োজনে বেস ক্লাস ভার্চুয়াল ফাংশন ওভাররাইড করতে পারে। | পিউর ভার্চুয়াল ফাংশন হলে ডেরাইভড ক্লাসকে অবশ্যই ওভাররাইড করতে হবে। |
ভার্চুয়াল ফাংশন
উদাহরণ কোড
#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) {
D d; // ক্লাস D-এর অবজেক্ট
B *b = &d; // B* টাইপের পয়েন্টার d-কে পয়েন্ট করছে
b->s(); // প্রিন্ট করবে "D::s() called"
return 0;
}আউটপুট
In Derived
পিউর ভার্চুয়াল ফাংশন
উদাহরণ কোড
#include <iostream>
using namespace std;
class B {
public:
virtual void s() = 0; // পিউর ভার্চুয়াল ফাংশন
};
class D: public B {
public:
void s() {
cout << "Virtual Function in Derived class\n";
}
};
int main() {
B *b;
D dobj; // ক্লাস D-এর অবজেক্ট
b = &dobj; // B* টাইপের পয়েন্টার dobj-কে পয়েন্ট করছে
b->s(); // প্রিন্ট করবে "D::s() called"
}আউটপুট
Virtual Function in Derived class