מאמרים
גיוס עובדים
זכויות עובדים
חיפוש עבודה
חשיבה חיובית
יומנו של מובטל
יזמות
כספים ופיננסים
מבחן גרפולוגי
מנהיגות
מקום עבודה
ניהול עובדים
עבודה בחו"ל
קורות חיים
קריירה
ראיונות עבודה
תורה פרנסה ויהדות
פרסום
   פולימורפיזם
לחץ להגדלה
מה זה פולימורפיזם ? מתי מגדירים virtual destructor ?

מאת: פורטל AllCareers
פורסם: 15/08/07 00:32

דף חדש 1

מתי מגדירים 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

   תגובות  (1) הוספת תגובה
1.
3 סוגי רב צורתיות 
ריק,ריק (04/04/2008)
 
© Copyright 2007. All Rights Reserved. לימודי תעודה מטפלת פיתוח אתרים מפת אתר Designed by scoopsites.net