6. ירושה מרובה – סקירה קצרה

מסמך זה אינו נכנס לעומק לנושא הירושה המרובה, אולם רציתי להזכיר את הרעיון הכללי – מהי ירושה מרובה.

בגדול – ירושה מרובה היא ירושה בה מחלקה נורשת ממספר מחלקות, ולא ממחלקה בודדת.

ירושה מרובה מבוצעת בשפת C++ בדומה להורשה יחידה. לאחר שם המחלקה, וכתיבת נקודותיים, מציינים רשימה של מחלקות מהן נורש האובייקט. לפני כל שם מחלקה יצוין סוג ההורשה. סדר המחלקות ברשימה משפיע על מבנה האובייקט ועל סדר הפעלת הבנאים וההורסים.

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

מתי נשתמש בירושה מרובה? טענה האהובה על אנשי Java היא שאין מקרים בהם חייבים להשתמש בהורשה מרובה. מצד אחד ניתן לתכנת ללא הורשה מרובה, אולם מצד שני יש מקרים רבים בהם הורשה מרובה היא הפתרון הטבעי לבעיה. הורשה מרובה זכתה לשם הרע שלה מכיוון שהיא יוצרת מבנים שלפעמים קשה להבין, ויש מספר בעיות הייחודיות לה. אם זאת, ניתן לומר דברים אלו על כל נושא בתכנות – כל נושא שלא שולטים בו טוב, יתכן ויהיו איתו בעיות, ולכן אין לפסול הורשה מרובה על הסף, כמו שרבים עושים. יתרה מזאת, ישנם מקרים בהם חייבים להשתמש בהורשה מרובה, לדוגמא כאשר יש לנו צורך להשתמש בשירותים הניתנים תחת protected של מספר מחלקות שונות.

בעיות בירושה מרובה:

  1. כפל משמעות: פונקציה בעלת אותו שם המוגדרת ביותר מבסיס אחד.
  2. Diamond – מחלקה אחת הקיימת יותר מפעם אחת בעץ הירושה. בשפת C++, בגלל גישת ההידור המחולק, כל מחלקה מחליטה אם לשתף לרמות הבאות את המחלקה/ות מהן היא יורשת. אם אחת המחלקות לא הסכימה לשתף מחלקות אלו, אז העותק ממנו היא יורשת יהיה נפרד. כדי לשתף את מחלקת הבסיס יורשים virtual בנוסף לסוג הירושה המבוקש (public virtual).

  • כפל משמעות: תתכן בעיה כזו עבור שדה נתונים או שיטה באותו שם: במצב של  שכפול מחלקת הבסיס יש שתי אפשרויות לבצע up-casing. בשפת C++, כפל משמעות של שיטה\משתנה יגרום לשגיאות קומפילציה.



מאת: ניצן

Borland style vptr

לפי מה שאני מכיר:
"חסרון בגישה זו: גם כאשר איננו משתמשים ב-dynamic binding – אנחנו משלמים במקום"
לא נכון , עבור מחלקה A שאין לה מתודות דינמיות לא יווצר כלל המצביע, ולמשל עבור מחלקה B שיורשת מA פשוט נוסיף בהתחלה את המצביע, ואחרי הבלוק של A את שאר האינפורמציה של B . וככה לא משלמים על מה שלא משתמשים ועקרונות C++ נשמרים.
מה שכן באמת הcasting קצת יותר מסובך....
שיתוף:
| עוד