মূল কন্টেন্টে যান
মডিউল 6 · 2-এর পাঠ 2কোর্সে 14/18~15 min
মডিউল পাঠ (2/2)

পলিমরফিজম এবং ভার্চুয়াল ফাংশন

পলিমরফিজম আমাদেরকে একটি পয়েন্টার বা তাদের বেস ক্লাসের রেফারেন্সের মাধ্যমে বিভিন্ন প্রাপ্ত ক্লাসের বস্তুগুলিকে চিকিত্সা করার অনুমতি দেয়, নিশ্চিত করে যে একটি পদ্ধতির সঠিক সংস্করণ রানটাইম (লেট বাইন্ডিং) এ কল করা হয়েছে।

ভার্চুয়াল ফাংশন: virtual এবং override

একটি পদ্ধতিতে পলিমরফিজম সক্ষম করতে, আমাদের অবশ্যই বেস ক্লাসের ভিতরে virtual কীওয়ার্ড ব্যবহার করে এটি ঘোষণা করতে হবে। প্রাপ্ত ক্লাসে, আমরা override স্পেসিফায়ার ব্যবহার করে স্পষ্টভাবে উল্লেখ করি যে আমরা সেই পদ্ধতিটিকে ওভাররাইড করছি।

C++
class Employee {
public:
    virtual void work() {
        std::cout << "Generic work" << std::endl;
    }
    // IMPORTANT: Virtual destructor in base class to avoid memory leaks
    virtual ~Employee() = default;
};

class Developer : public Employee {
public:
    void work() override {
        std::cout << "Writing C++ code" << std::endl;
    }
};

বেস ক্লাসে পয়েন্টার ব্যবহার করে, C++ রানটাইমে সঠিক পদ্ধতিটি সমাধান করবে:

C++
Employee* emp = new Developer();
emp->work(); // Prints "Writing C++ code" instead of "Generic work"
delete emp;

বিমূর্ত ক্লাস এবং বিশুদ্ধ ভার্চুয়াল ফাংশন

একটি বিশুদ্ধ ভার্চুয়াল ফাংশন হল একটি ভার্চুয়াল সদস্য ফাংশন যা শেষে = 0 এর সাথে ঘোষণা করা হয়। এটি একটি আনুষ্ঠানিক চুক্তির প্রতিনিধিত্ব করে: বেস ক্লাস কোন বাস্তবায়ন প্রদান করে না, এটিকে সম্পূর্ণভাবে উপশ্রেণীতে অর্পণ করে।

অন্তত একটি বিশুদ্ধ ভার্চুয়াল ফাংশন সম্বলিত একটি ক্লাসকে বিমূর্ত শ্রেণী বলা হয় এবং সরাসরি ইনস্ট্যান্ট করা যায় না।

C++
class Instrument {
public:
    virtual void play() = 0; // Pure virtual
    virtual ~Instrument() = default;
};

class Piano : public Instrument {
public:
    void play() override {
        std::cout << "Playing piano..." << std::endl;
    }
};

নিজে চেষ্টা করে দেখুন

ব্যায়াম#cpp.m6.l2.e1
প্রচেষ্টা: 0লোড হচ্ছে...

প্রাণীতে একটি ভার্চুয়াল পদ্ধতি makeSound() সংজ্ঞায়িত করুন যা 'কিছু শব্দ' প্রিন্ট করে। তারপর 'Meow' প্রিন্ট করতে ওভাররাইড স্পেসিফায়ার ব্যবহার করে ক্যাট ক্লাসে ওভাররাইড করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

মনে রাখবেন বেস ক্লাস পদ্ধতিতে `ভার্চুয়াল` প্রিপেন্ড করতে এবং প্রাপ্ত ক্লাসে প্যারামিটার বন্ধনীর পরে `ওভাররাইড` বসাতে হবে।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম#cpp.m6.l2.e2
প্রচেষ্টা: 0লোড হচ্ছে...

একটি বিশুদ্ধ ভার্চুয়াল ফাংশন প্রিন্ট() বিমূর্ত শ্রেণীর মুদ্রণযোগ্য মধ্যে অকার্যকর রিটার্নিং ঘোষণা করুন। তারপর ডকুমেন্ট ক্লাস তৈরি করুন যা সর্বজনীনভাবে মুদ্রণযোগ্য থেকে উত্তরাধিকারসূত্রে প্রাপ্ত হয় এবং 'প্রিন্টিং ডকুমেন্ট' প্রিন্ট করতে print() পদ্ধতি প্রয়োগ করে।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

একটি বিশুদ্ধ ভার্চুয়াল ফাংশন স্বাক্ষরের সাথে ঘোষণা করা হয় `ভার্চুয়াল অকার্যকর প্রিন্ট() = 0;`। নিশ্চিত করুন `ডকুমেন্ট` সর্বজনীনভাবে `মুদ্রণযোগ্য` থেকে উত্তরাধিকারসূত্রে পাওয়া যায়।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ