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

class Base {
public:
 int x;
};

class Sub1:public Base {
public:
 int y;
};

class Sub2:public Base {
public:
 int z;
};

class SubSub:public Sub1, public Sub2 {
public:
 int w;
};
העבר את העכבר על שורות הקוד בכדי לקבל הסבר מפורט

במקרה זה כל המשתנה x הנורש מהמחלקה Base יופיע במחלקה היורשת SubSub בשני עותקים, פעם אחת עבור Sub1 ופעם אחת עבור Sub2.
אך לעיתים נרצה עותק אחד בלבד של המשתנה x במחלקה SubSub. הדרך לעשות זאת היא ע"י גזירת המחלקות Sub1 ו-Sub2 מהמחלקה Base בתוספת המילה virtual, דבר הנקרא הורשה וירטואלית:

class Base {
public:
 int x;
};

class Sub1:virtual public Base {
public:
 int y;
};

class Sub2:virtual public Base {
public:
 int z;
};

class SubSub:public Sub1, public Sub2 {
public:
 int w;
};
העבר את העכבר על שורות הקוד בכדי לקבל הסבר מפורט

המילה virtual מבקשת שהמשתנים המשותפים המגיעים דרך Sub1 ו-Sub2 יישבו באותו מקום בזיכרון, אך שלכל מחלקה מבין Sub1 ו-Sub2 יהיה מצביע למשתנה המשותף.
השימוש בהורשה וירטואלית יידרש כאשר הנתונים המועברים ממחלקת האב Base ייצגו את אותה ישות עבור שתי המחלקות היורשות.
חשוב להדגיש שהורשה וירטואלית תחייב להוסיף בכל אחת מהמחלקות Sub1 ו-Sub2 מפרק וירטואלי, גם אם אין צורך במפרק כלל.