Menu
Coddy logo textTech

ירושה בסיסית

חלק מהיחידה תכנות מונחה עצמים במסלול ה-C++ של Coddy. שיעור 48 מתוך 104.

ירושה מאפשרת למחלקה לרכוש את המאפיינים וההתנהגויות של מחלקה אחרת. המחלקה שממנה יורשים נקראת מחלקת בסיס (או מחלקת אב), והמחלקה שיורשת נקראת מחלקה נגזרת (או מחלקת בת).

כדי ליצור מחלקה נגזרת, השתמש בנקודתיים ולאחריהם מציין הגישה ושם מחלקת הבסיס:

class Animal {
public:
    std::string name;
    
    void eat() {
        std::cout << name << " is eating" << std::endl;
    }
};

class Dog : public Animal {
public:
    void bark() {
        std::cout << name << " says woof!" << std::endl;
    }
};

כעת למחלקה Dog יש גישה גם אל name ואל eat() מתוך Animal, וגם אל המתודה bark() שלה. זוהי מהות ההורשה: שימוש חוזר בקוד קיים תוך הוספת פונקציונליות חדשה.

Dog myDog;
myDog.name = "Buddy";
myDog.eat();    // עבר בירושה מ־Animal
myDog.bark();   // מוגדר ב־Dog

מילת המפתח public לפני Animal מציינת את סוג ההורשה. הורשה ציבורית פירושה שהחברים הציבוריים של מחלקת הבסיס נשארים ציבוריים במחלקה הנגזרת. זוהי הצורה הנפוצה ביותר, והיא מדמה קשר מסוג "הוא-סוג-של": כלב הוא בעל חיים.

challenge icon

אתגר

קל

בואו נבנה היררכיית כלי רכב פשוטה שמדגימה ירושה בפעולה. תיצור מחלקת בסיס Vehicle ומחלקה נגזרת Motorcycle שמרחיבה אותה עם התנהגות ייחודית.

תארגן את הקוד שלך בשלושה קבצים:

  • Vehicle.h: הגדר מחלקת בסיס Vehicle עם:
    • חבר ציבורי std::string brand
    • חבר ציבורי int year
    • מתודה ציבורית displayInfo() שמדפיסה את מותג כלי הרכב ואת שנת הייצור בפורמט: Brand: <brand>, Year: <year>
  • Motorcycle.h: הגדר מחלקת Motorcycle שיורשת באופן ציבורי מ־Vehicle. המחלקה הנגזרת הזאת צריכה להוסיף:
    • חבר ציבורי int engineCC עבור נפח המנוע
    • מתודה ציבורית revEngine() שמדפיסה: <brand> goes vroom vroom!

    מחלקת Motorcycle תירש באופן אוטומטי את brand, את year ואת displayInfo() מ־Vehicle.

  • main.cpp: קרא שלוש קלטים (כל אחד בשורה נפרדת):
    1. שם המותג (מחרוזת)
    2. שנה (מספר שלם)
    3. נפח מנוע בסמ״ק (מספר שלם)

    צור אובייקט Motorcycle, הגדר את החברים שירש (brand ו־year) וגם את החבר שלו engineCC. לאחר מכן הפק שלוש שורות פלט לפי הסדר: תחילה קרא למתודה שירש displayInfo(), לאחר מכן הדפס בעצמך את נפח המנוע באמצעות std::cout << "Engine: " << moto.engineCC << "cc" << std::endl;, ולבסוף קרא למתודה הייחודית לאופנוע revEngine(). כך מודגמת ירושה באמצעות שימוש הן במתודה שהורשה והן במתודה של המחלקה הנגזרת.

    פורמט הפלט:

    Brand: <brand>, Year: <year>
    Engine: <engineCC>cc
    <brand> goes vroom vroom!

לדוגמה, עבור הקלטים Harley, 2022 ו־1200:

Brand: Harley, Year: 2022
Engine: 1200cc
Harley goes vroom vroom!

אל תשכח לכלול guards לכותרות בקובצי הכותרת שלך ולהשתמש ב־#include "Vehicle.h" בכותרת של Motorcycle כדי לגשת למחלקת הבסיס.

נסו בעצמכם

#include <iostream>
#include <string>
#include "Motorcycle.h"

using namespace std;

int main() {
    string brand;
    int year;
    int engineCC;

    cin >> brand;
    cin >> year;
    cin >> engineCC;

    // TODO: צור אובייקט מסוג Motorcycle
    // TODO: הגדר את השדות brand, year ו-engineCC שלו
    // TODO: קרא ל-displayInfo() כדי להציג מידע שעבר בירושה
    // TODO: הדפס את פרטי המנוע בפורמט: Engine: <engineCC>cc
    // TODO: קרא ל-revEngine() כדי להדגים התנהגות ייחודית לאופנוע

    return 0;
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר C++ אונליין