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

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

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

class Dog:public Animal {
public:
 dogFood food;
 int weight;
 void Bill();
};
העבר את העכבר על שורות הקוד בכדי לקבל הסבר מפורט

ונשכתב את לולאת חישוב החשבונות בצורה הבאה:

for (int i=0; i<animalCount; i++)
 a[i]->Bill();
העבר את העכבר על שורות הקוד בכדי לקבל הסבר מפורט

קודם לא יכולנו להחליט לאיזו פונקציה לקרוא, אך כעת איננו צריכים להחליט. המחשב יחליט בזמן ריצה לאיזו גרסה של Bill לקרוא, בהתאם לסוג האובייקט.
אם האובייקט הוא מסוג Cat הוא יקרא לפונקציה שבמחלקת Cat, ובאותה צורה לגבי Dog.
כל זאת בזכות המילה virtual. ללא המילה virtual, הפונקציה שתיקרא תיקבע בהתאם לסוג המצביע, במקרה זה כל המצביעים הם מסוג Animal ולכן תיקרא הפונקציה שבמחלקת האב.
ע"י הוספת המילה virtual אנו מחייבים את המחשב להשתמש בסוג האובייקט ולא בסוג המצביע כדי לקבוע לאיזו פונקציה לקרוא.
תכונת ה-virtual עוברת בהורשה. פונקציה שהוגדרה כוירטואלית במחלקת האב, תהיה וירטואלית בכל תת המחלקות, גם אם לא נציין זאת.
הרעיון הזה נקרא רב צורתיות (polymorphism) - האובייקט מתנהג בדיוק לפי החוקים שנקבעו לו. המהדר יודע לאיזו פונקציה לקרוא על סמך סוג האובייקט, ומשתמש בה אוטומטית.