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

class Animal {
public:
 char name[32];
 int kennel;
 int days;
 Animal();
 void PrintName();
};

class Cat:public Animal {
public:
 catFood food;
 Cat();
 void CatBill();
};

Animal *p;
Animal b;
Cat c;
p = &b;
p = &c;
העבר את העכבר על שורות הקוד בכדי לקבל הסבר מפורט

חשוב לזכור שהפעולה ההפוכה אינה אפשרית. מצביע של תת המחלקה אינו יכול להצביע לאובייקט של מחלקת האב.
כאשר המצביע מצביע לאובייקט של מחלקת האב, ניתן לגשת לכל משתני המחלקה ופונקציות החבר של האובייקט:

p = &b;
p->name = "Buffy";
p->PrintName();
העבר את העכבר על שורות הקוד בכדי לקבל הסבר מפורט

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

p = &c;
p->name = "Fluffy";
p->PrintName();
העבר את העכבר על שורות הקוד בכדי לקבל הסבר מפורט

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

((Cat *)p)->food = dryCatFood;
((Cat *)p)->CatBill();
העבר את העכבר על שורות הקוד בכדי לקבל הסבר מפורט