מתי מגדירים
virtual destructor
?
כאשר קיים מצביע למחלקת
בסיס ומופעל עליו
delete
אין קוראים להורס של המחלקה הנגזרת.
לכן צריך להגדיר את ההורס במחלקת הבסיסי כווירטואלי.
// BAD!!!
class B {
public:
B() {}
~B() {}
};
class D : public B {
int *a;
public:
D() { a = new int[10]; }
~D() { delete[] a; }
void f(p2d c) {}
};
void main()
{
B* p = new D;
// ~D() is not called here!
delete p;
}
// GOOD!!!
class B {
public:
B() {}
virtual
~B() {}
class D : public B {
int *a;
public:
D() { a = new int[10]; }
~D() { delete[] a; }
void f(p2d c) {}
};
void main()
{
B* p = new D;
// calling ~D() here!
delete p;
}
מה זה
פולימורפיזם ?
פולימורפיזם:
התייחסות לאובייקטים שונים באופן קבוע ואחיד .
נניח שיש לנו
שלושה אובייקטים מטיפוסים שונים אובייקט
A
מסוג משולש אובייקט
B
מסוג ריבוע ואבייקט
C
מסוג מעגל
נניח כי לכל
אובייקט קיימת שיטה לחישוב שטח בשם Area
האם השיטה
Area היא בעלת מימוש זהה בכל אחד
משלושת האובייקטים ?
התשובה : לא
.
לכל אובייקט
שיטת חישוב השטח שונה ולכן בקריאה לשיטה Area
אנו מצפים שכל אובייקט יממש אחרת את השיטה ע"פ סוג האובייקט .
אם האובייקט
מסוג ריבוע השיטה תבצע חישוב של צלע בריבוע ,עבור אובייקט מסוג משולש השיטה תבצע
הכפלת הגובה במחצית הבסיס
ועבור אובייקט
מסוג מעגל השיטה Area תבצע
חישוב של פאי כפול רדיוס בריבוע .
כאשר אנו פונים
לאובייקט ומבקשים ממנו לבצע חישוב שטח אנו מצפים כי האובייקט יחשב את השטח ע"פ
סוג האובייקט למרות שאנו פונים באופן אחיד לאותה שיטה כלפי כל סוגי האובייקטים .
דוגמא נוספת:
כל בעלי החיים חולקים דברים משותפים:
לכולם יש משקל, גובה, גיל.
כולם אוכלים ומשמיעים קולות.
נרצה לתאר מחלקות מעולם החי בתוכניתנו ולהראות קשר זה.
יחד עם זאת לאפשר גמישות של התנהגות שונה כאשר הדבר נדרש.
class Animal {
public:
int getAge() ;
virtual void makeSound();
private:
int weight,age ;
};
class Dog : public Animal{
void makeSound() ;
} ;
ניתן במחלקה היורשת ממחלקה אחרת להגדיר מחדש פונקציות אשר הוגדרו
במחלקת האב.
אולם הדבר יגרום לכך שהפונקציה שתיקרא תלויה בדרך בא קראנו לה:
Dog * d = new
Dog();
Animal * a = d ;
a->makeSound();
d->makeSound() ;
אם נרצה שההתנהגות השונה תחול גם כאשר ניגשים לפונקציה דרך מצביע
לאב - נעזר בפונקציות ווירטואליות.
class Dog :
public Animal{
public:
void
makeSound() {
cout << “vuf vuf\n”;
}
} ;
class Cat :
public Animal{
public:
void
makeSound() {
cout << “miao\n”;
}
} ;
כאשר מגדירים פונקציה וירטואלית בעצם אומרים שהאופן המדויק בו
יתנהג האובייקט תלוי בטיפוס הבן עימו אנו עובדים. למי שנעזר באובייקט האב לא משנה
מה הטיפוס המדויק של הבן והוא יכול לעבוד עם כולם באופן אחיד.
main () {
Animal* dog
= new Dog();
Animal* cat
= new Cat();
Animal*
whoami = new Bear();
dog->makeSound();
cat->makeSound();
whoami->makeSound();
}
פלט התוכנית
vuf vuf
miao
orrrr
פורטל
קריירה
- AllCareers