ירושה בסיסית
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 מציינת את סוג ההורשה. הורשה ציבורית פירושה שהחברים הציבוריים של מחלקת הבסיס נשארים ציבוריים במחלקה הנגזרת. זוהי הצורה הנפוצה ביותר, והיא מדמה קשר מסוג "הוא-סוג-של": כלב הוא בעל חיים.
אתגר
קלבואו נבנה היררכיית כלי רכב פשוטה שמדגימה ירושה בפעולה. תיצור מחלקת בסיס 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: קרא שלוש קלטים (כל אחד בשורה נפרדת):- שם המותג (מחרוזת)
- שנה (מספר שלם)
- נפח מנוע בסמ״ק (מספר שלם)
צור אובייקט
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;
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות OOP
קבצים חיצונייםבנייה וקומפילציה של C++קובצי Header וקובצי מקורמרחבי שמות והיקףמבוא ל-OOP ב-C++מחלקות לעומת אובייקטיםמצביע thisמתודות (פונקציות איבר)תכונות (חברי נתונים)יסודות הבנאים וההורסיםסיכום – מחשבון פשוט4מאפייני מחלקה
חברי מופע לעומת חברים סטטייםגטרים וסטריםפונקציות איבר קבועותמילת המפתח mutableמתודות ומשתנים סטטייםפונקציות ומחלקות ידידותסיכום – מנהל חשבונות בנק7ירושה
ירושה בסיסיתרמות גישה בירושהסדר הקריאות לבנאי ולמפרקדריסת מתודותפונקציות וירטואליות ו־VTableירושה מרובהירושה וירטואליתסיכום – היררכיית עובדים2ניהול זיכרון
זיכרון Stack לעומת Heapמצביעים והפניותזיכרון דינמי (new/delete)מצביעים חכמים ב-C++RAII ב-C++סיכום – מנהל מערכים דינמיים5כימוס
מצייני גישה ב-C++מצייני גישה לעומקהסתרת מידעמבנה לעומת מחלקהמחלקות מקוננות ופנימיותסיכום – מערכת רשומות תלמידים8רב־צורתיות
רב־צורתיות בזמן קומפילציה לעומת בזמן ריצההעמסת פונקציותפונקציות וירטואליות — מבט נוסףפונקציות וירטואליות טהורותמחלקות מופשטותתכנון ממשקים ב־C++המרה דינמית ו־RTTIסיכום — מחשבון צורות3בנאים והורסים
בנאי ברירת מחדלבנאי עם פרמטריםבנאי העתקהבנאי העברהרשימות אתחול בבנאיםבנאים מאציליםמעמיקים בנושא הורסיםכלל השלושה / החמישה / האפססיכום – מחלקת String6העמסת אופרטורים
מבוא להעמסת אופרטוריםהעמסת אופרטורים אריתמטייםהעמסת אופרטורי השוואהאופרטורי זרםהעמסת אופרטור השמההעמסת האופרטורים [] ו־()אופרטורים להמרת טיפוסיםסיכום – מחלקת Matrix9תבניות
תבניות פונקציהתבניות מחלקההתמחות תבניותתבניות ארגומנטים משתנותיסודות SFINAE ותכונות טיפוסיםסיכום – מכל גנריתרגלו בעצמכם: קומפיילר C++ אונליין