Header Ads

ফাংশন ওভাররাইডিং | ভার্চুয়াল ফাংশন | পিওর ভার্চুয়াল ফাংশন(Function overriding | Virtual function | Pure virtual function)

শুরু করছি পলিমরফিজম নিয়ে শেষ লেখা। এই পর্বে বেশ কিছু গুরুত্বপূর্ণ জিনিস নিয়ে আলোচনা করব।

আগের পর্ব ছিলো ফাংশন ওভারলোডিং নিয়ে এবং এই পর্বে আলোচনা করব মূলত রান টাইম পলিমরফিজম সম্পর্কিত, ফাংশন ওভাররাইডিং, ভার্চুয়াল ফাংশন এবং পিওর ভার্চুয়াল ফাংশন নিয়ে।

Function overriding

পলিমরফিজম নিয়ে ১ম পর্বে আমরা জেনেছি, যদি প্যারেন্ট ক্লাস ও চাইল্ড ক্লাসে একই নামে মেথড ইমপ্লিমেন্ট করা থাকে তাহলে তা ফাংশন ওভাররাইডিং। মূলত একই নামের মেথড কিন্তু ভিন্ন ইমপ্লিমেন্টেশন থাকলে তা হচ্ছে ফাংশন ওভাররাইডিং। এখন আমরা একটি প্যারেন্ট ক্লাস Animal তৈরি করব এবং চাইল্ড ক্লাস Dog তৈরি করব। দুইটি ক্লাসের Sound() নামে একটি মেথড তৈরি করব যার কাজ হচ্ছে প্রাণীর Sound প্রিন্ট করা। এখানে আমরা ফাংশন ওভাররাইডিং ব্যবহার করব।


class Animal {

public:

  void Sound() {

    cout << "Animal Sound" << endl;

  }

};


class Dog : public Animal {

public:

  void Sound() {

    cout << "woof" << endl;

  }

};


int main()

{

  // it is another approach to create object

  Animal animal = Animal();

  Dog dog = Dog();


  animal.Sound();

  dog.Sound();


  return 0;

}

এখানে দেখা যাচ্ছে মেথড দুটোর নাম একই কিন্তু ইমপ্লিমেন্টেশন ভিন্ন। কিন্তু আমরা যদি চাই Animal ক্লাসের অবজেক্টে Dog ক্লাসের অবজেক্টে রাখব এবং সে অবজেক্ট দিয়ে চাইল্ড ক্লাস বা Dog ক্লাসের Sound() মেথড কল হতে হবে। 

Virtual function

ভার্চুয়াল ফাংশন মানে হচ্ছে, সবসময় চাইল্ড ক্লাসের ওভাররাইড করা মেথড কল হবে তবে যদি চাইল্ড ক্লাসে ঐ মেথড টি ইমপ্লিমেন্ট করা না থাকে তাহলে প্যারেন্ট ক্লাসের ওভাররিডেন বা যে মেথড টি ওভাররাইড হওয়ার কথা সেটি কল হবে।


class Animal {

public:

  virtual void Sound() {

    cout << "Animal Sound" << endl;

  }

};


class Dog : public Animal {

public:

  void Sound() {

    cout << "woof" << endl;

  }

};


int main()

{

  Animal* dog = new Dog();


  dog->Sound();


  return 0;

}

ভার্চুয়াল ফাংশন ইমপ্লিমেন্ট করার জন্য প্যারেন্ট ক্লাসের ওভাররিডেন ফাংশনের আগে virtual কিওয়ার্ড ব্যবহার করতে হয়। আর অবজেক্ট ক্রিয়েট করার সময় পয়েন্টার টাইপের অবজেক্ট ক্রিয়েট করতে হবে নাহলে প্যারেন্ট ক্লাসের মেথড টিই কল হবে এবং পয়েন্টার টাইপের অবজেক্ট ব্যবহার করে কোন কিছু এক্সেস করতে হলে (.) ডট ব্যবহার করা যাবে না এর পরিবর্তে (->) অ্যারো ব্যবহার করতে হবে। কোডে দেখতে পারছেন dog->Sound() এই ভাবে মেথড কল করেছি। 

আগে বলেছি চাইল্ড ক্লাসের ওভাররাইডিং ফাংশন ইমপ্লিমেন্ট করা না থাকলে প্যারেন্ট ক্লাসের ওভাররিডেন ফাংশন কল হবে। এখন সেটিও দেখব উদাহরণের মাধ্যমে।


class Animal {

public:

  virtual void Sound() {

    cout << "Animal Sound" << endl;

  }

};


class Dog : public Animal {

public:

//  void Sound() {

//    cout << "woof" << endl;

//  }

};


int main()

{

  Animal* dog = new Dog();


  dog->Sound();


  return 0;

}

এখানে প্যারেন্ট ক্লাসে যে মেথড টি থাকে তাকে বলে ওভাররিডেন ফাংশন এবং চাইল্ড ক্লাসে যে মেথড টি থাকে তাকে বলে ওভাররাইডিং ফাংশন।

Pure virtual function

আমরা দেখেছি ভার্চুয়াল ফাংশনের বেলায় ওভাররাইডিং ফাংশন ইমপ্লিমেন্ট করা না থাকলে ওভাররিডেন ফাংশন কল হয় কিন্তু পিওর ভার্চুয়াল ফাংশনের উদ্দেশ্য হচ্ছে চাইল্ড ক্লাসে ওভাররাইডিং ফাংশন ইমপ্লিমেন্ট করা থাকতেই হবে এবং এটি যেন বাধ্য হয়েই করতে হয় তাই প্যারেন্ট ক্লাসের মেথড এ শুন্য এসাইন করে রাখতে হয়, virtual void Sound() = 0;। 

Animal ক্লাস গুলো নিয়ে আরো আলোচনা করতে পারি। যেমন, Dog এর শব্দ করা হচ্ছে woof, Cat এর শব্দ করা হচ্ছে meaow, এরকম বিভিন্ন প্রাণীর শব্দ ভিন্ন ভিন্ন কিন্তু Animal ক্লাসে Sound() মেথডে কার শব্দ রাখব? সুতরাং এটি তে শুন্য এসাইন করে দেওয়াই ভালো। Animal ক্লাসে আমরা নাম, হাইট, ওয়েট ইত্যাদি রাখতে পারি যেন তা ভিন্ন ভিন্ন প্রাণীর ক্লাস ইনহেরিট করে নিতে পারে এবং Sound() মেথড টি ওভাররাইড করার ব্যবস্থা করে রাখতে পারি। 

পিওর ভার্চুয়াল ফাংশন করতে হলে শুধুমাত্র virtual void Sound() = 0; এই পরিবর্তন টা করলেই হচ্ছে। আশাকরছি করে নিতে পারবেন। তারপরেও কোড দিয়ে দিচ্ছি আমি। 


class Animal {

public:

  // pure virtual function

  virtual void Sound() = 0;

};


class Dog : public Animal {

public:

  void Sound() {

    cout << "woof" << endl;

  }

};


class Cat : public Animal {

public:

  void Sound() {

    cout << "meaow" << endl;

  }

};


int main()

{

  Animal* dog = new Dog();

  Animal* cat = new Cat();


  dog->Sound();

  cat->Sound();


  return 0;

}

এবার কিন্তু চাইল্ড ক্লাসে ওভাররাইডিং ফাংশন ইমপ্লিমেন্ট না করলে ইরোর দিবে। চেষ্টা করে দেখতে পারেন।

আশাকরি পলিমরফিজম বুঝতে পেরেছেন। পরের পর্ব থাকবে আরেকটি গুরুত্বপূর্ণ টপিক abstraction নিয়ে। বুঝতে সমস্যা হলে বারবার পড়ে প্র্যাক্টিস করতে থাকুন এবং তাও সমস্যা হলে কমেন্ট করতে পারেন।

No comments

Powered by Blogger.