דילוג לתוכן המרכזי
מודול 6 · שיעור 2 מתוך 214/18 בקורס~15 min
שיעורי מודול (2/2)

פולימורפיזם ופונקציות וירטואליות

פולימורפיזם מאפשר לנו לטפל באובייקטים של מחלקות נגזרות שונות באמצעות מצביע או הפניה למחלקה הבסיסית שלהם, מה שמבטיח שהגרסה הנכונה של מתודה נקראת בזמן ריצה (Late Binding).

פונקציות וירטואליות: 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() ב- Animal שמדפיסה 'Some sound'. לאחר מכן דחוף אותו במחלקה Cat באמצעות מפרט ההחלפה כדי להדפיס 'מיאו'.

טוען עורך...
הצג רמז

זכור להוסיף 'וירטואלי' לשיטת מחלקה הבסיסית ולמקם 'החלפה' אחרי הסוגריים של הפרמטרים במחלקה הנגזרת.

הפתרון זמין לאחר 3 ניסיונות

פעילות גופנית#cpp.m6.l2.e2
ניסיונות: 0טוען...

הכרז על פונקציה וירטואלית טהורה print() המחזירה ריק בתוך המחלקה המופשטת Printable. לאחר מכן צור את המחלקה Document שיורשת באופן ציבורי מ-Printable ומיישמת את שיטת print() להדפסת 'הדפסת מסמך'.

טוען עורך...
הצג רמז

פונקציה וירטואלית טהורה מוכרזת עם החתימה `virtual void print() = 0;`. ודא ש'מסמך' יורש באופן ציבורי מ'ניתן להדפסה'.

הפתרון זמין לאחר 3 ניסיונות