مرکزی مواد پر جائیں
ماڈیول 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لوڈ ہو رہا ہے…

Animal میں ایک ورچوئل طریقہ makeSound() کی وضاحت کریں جو 'Some sound' پرنٹ کرتا ہے۔ پھر 'میاؤ' کو پرنٹ کرنے کے لیے اوور رائڈ سپیفائر کا استعمال کرتے ہوئے اسے کیٹ کلاس میں اوور رائڈ کریں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

بیس کلاس کے طریقہ کار میں `ورچوئل` کو پہلے سے جوڑنا اور اخذ شدہ کلاس میں پیرامیٹر قوسین کے بعد `اوور رائیڈ` رکھنا یاد رکھیں۔

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش#cpp.m6.l2.e2
کوششیں: 0لوڈ ہو رہا ہے…

ایک خالص ورچوئل فنکشن پرنٹ () کو تجریدی کلاس پرنٹ ایبل کے اندر باطل واپس کرنے کا اعلان کریں۔ پھر دستاویز کی کلاس بنائیں جو عوامی طور پر پرنٹ ایبل سے وراثت میں ملتی ہے اور 'پرنٹنگ دستاویز' کو پرنٹ کرنے کے لیے print() طریقہ کو نافذ کرتی ہے۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

ایک خالص ورچوئل فنکشن دستخط `ورچوئل ویوڈ پرنٹ() = 0;` کے ساتھ اعلان کیا جاتا ہے۔ یقینی بنائیں کہ 'دستاویز' عوامی طور پر 'پرنٹ ایبل' سے وراثت میں ملتی ہے۔

3 کوششوں کے بعد حل دستیاب ہے۔