C++ এ Virtual function সাধারনত ব্যবহার করা হয় function Override করার জন্য। Virtual কী ওয়ার্ড না দিলেও ফাংশন ওভার রাইড হবে কিন্তু exact ফাংশন ওভার রাইড হবে না। ধরা যাক বেস ক্লাস এর একটি ফাংশন func() কে আমরা ডিরাইভড ক্লাস এ ওভাররাইড করব।
class base
{
public:
void func()
{
cout<<"Base Function"<<endl;
}
};
class derived:public base
{
public:
void func()
{
cout<<"Derived Function"<<endl;
}
};
এখন বেস ক্লাস এর পয়েন্টার অব্জেক্ট *p দিয়ে func() কে কল করলে বেস ক্লাস এর func() এ কল হবে এবং আউটপুট হবে Base Function । কিন্তু আমরা যদি বেস ক্লাস এর পয়েন্টার অব্জেক্ট *p এ ডিরাইভড ক্লাস এর অব্জেক্ট এর এড্রেস কে পয়েন্ট করি এবং কল দেই তবুও বেস ক্লাস এর func() এ কল হবে এবং আউটপুট হবে Base Function ।
#include <bits/stdc++.h>
using namespace std;
class base
{
public:
void func()
{
cout<<"Base Function"<<endl;
}
};
class derived:public base
{
public:
void func()
{
cout<<"Derived Function"<<endl;
}
};
int main()
{
base *p;
derived o2;
p=&o2;
p->func();
return 0;
}
Output= Base Function
এক্ষেত্রে কম্পাইলার এর বুঝতে প্রব্লেম হচ্ছে আসলে কাকে কল করবে কারন Early Binding এ শুধু পয়েন্টার এর ক্লাস টাইপ দেখে তাই বেস ক্লাস এ যাচ্ছে। তাই ডিরাইভড ক্লাস এর অব্জেক্ট এর এড্রেস যে *p এ এসাইন করা হয়েছে তা
Early Binding এ বোঝা যায় না। এই সমস্যা দূর করার জন্য বেস ক্লাস এর void func() এর আগে virtual keyword লাগিয়ে দিতে হবে। তাহলে Late Binding হবে মানে Runtime এ কম্পাইলার বুঝতে পারবে কার এড্রেস কোথায় এসাইন হয়ে আছে। ফলে কম্পাইলার virtual দেখে Late Binding করবে এবং ডিরাইভড ক্লাস এর ওভাররাইডেড ফাংশনে যাবে। তাহলে আউটপুট হবে Derived Function।
#include <bits/stdc++.h>
using namespace std;
int a,b,c,d;
class base
{
public:
virtual void func()
{
cout<<"Base Function"<<endl;
}
};
class derived:public base
{
public:
void func()
{
cout<<"Derived Function"<<endl;
}
};
int main()
{
base *p;
derived o2;
p=&o2;
p->func();
return 0;
}
Output= Derived Function
Pure Virtual function/Abstract Class : যখন কোন ক্লাস থেকে অব্জেক্ট বানানো যায় না কারন ক্লাস এ pure virtual function থাকে যার ফাংশন বডি থাকে না এবং যাকে Base Class এর অব্জেক্ট দিয়ে কল করা যায় না, শুধু ওভার রাইড করা যায় এবং ওভার রাইডেড ফাংশন কল করা যায় তখন সেই ক্লাস কে Abstract Class বলে। Abstract Class বানানো হয় কোড মেইন্টেইন করার জন্য। কমন ফিচার গুলো একই ক্লাস এ রেখে সুবিধামত ওভার রাইড করে কাজ করা যায় । Pure Virtual function নিচের মত করে ডিক্লেয়ার করতে হয়।
#include <bits/stdc++.h>
using namespace std;
class base
{
public:
virtual void func()=0; //pure virtual function
};
class derived:public base
{
public:
void func()
{
cout<<"Derived Function"<<endl;
}
};
int main()
{
derived o2;
o2.func();
return 0;
}
0 comments:
Post a Comment