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

Animal *a[10];
העבר את העכבר על שורות הקוד בכדי לקבל הסבר מפורט

בנוסף, נחזיק משתנה שיעקוב אחר מספר המצביעים שבשימוש במערך:

int animalCount = 0;
העבר את העכבר על שורות הקוד בכדי לקבל הסבר מפורט

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

a[animalCount++] = new Cat;
a[animalCount++] = new Dog;
העבר את העכבר על שורות הקוד בכדי לקבל הסבר מפורט

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

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

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

אז כדי לחשב את החשבון לכל החיות, הגיוני שעלינו ליצור לולאה בסגנון הבא:

for (int i=0; i<animalCount; i++)
{
 if ( /* ??? */ )
  a[i]->CatBill();
 else
  a[i]->DogBill();
}
העבר את העכבר על שורות הקוד בכדי לקבל הסבר מפורט

אך איזה תנאי נשים בפקודת ה-if? במילים אחרות, איך נדע אם לקרוא לפונקצית החשבון של הכלב או של החתול?