דף הבית >>הורשה>> גישה למחלקת בסיס>>הורשה וחברים מוגנים>> הורשת מחלקת בסיס מוגנת >>
>>פונקציות בונות הורסות והורשה

 

פונקציות בונות ,הורסות ,והורשה .

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

 

מתי הפונקציות הבונות וההורסות מתבצעות.

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

#include <iostream.h>

class base  {
public :
       base  ( ) {cout <<  " constructing base \n " ;  }
       ~base ( ) {cout << " destructing   base \n " ; }
};

class derived : public base {
public:
       derived ( )    {cout<<  " constructing derived " \n" ;}
      ~derived ( )   {cout<<  " destructing   derived " \n" ;}
};

int main ( )
{
       derived  ob;
//do nothing but construct and destruct ob
       return 0;
}



פירוש ה( )main , מצביע על שהתוכנית פשוט בונה ואח"כ הורסת אובייקט שנקרא ob ממחלקה derived,כשהתוכנית מתבצעת היא מציגה:

constructing base

constructing derived
destructing   derived
destructing   base

כפי שאתה יכול לראות ,הבנאי של מחלקת הבסיס מתבצע לפי המחלקה הנגזרת,לאחר מכן (בגלל ש ob מיד נהרס בתוכנית), הפונקציה ההורסת של המחלקה הנגזרת נקרא לפי מחלקת בסיס.מתי שאובייקט של מחלקת נגזרת נוצר ,אם מחלקת בסיס מכילה בנאי ,הוא יקרא קודם לפי הבנאי של המחלקה הנגזרת. ומתי שהאובייקט של המחלקה הנגזרת נהרסת,הפונקציה ההורסת נקראת ראשונה לפי הפונקציה ההורסת של מחלקת הבסיס ,אם היא קיימת .פונקציות הבניה מתבצעות לפי הסדר המקורי ,ופונקציות ההריסה מתבצעות בסדר הפוך למקור.במקרים של הורשה מרובה (מתי שמחלקה נגזרת הופכת לבסיס של מחלקה הנגזרת ממנה),הכלל הכללי תקף: הבנאים נקראים בסדר המקורי ,והפונקציות ההורסות נקראות בסדר הפוך,לדוגמה התוכנית הבאה:


#include <iostream.h>
class base  {
public :
       base  ( ) {cout <<  " constructing base \n " ;  }
       ~base ( ) {cout << " destructing   base \n " ; }
};
class derived1 : public base {
public:
       derived1( )    {cout<<  " constructing derived " \n" ;}
      ~derived1 ( )   {cout<<  " destructing   derived " \n" ;}
};

class derived2 : public base {
public:
       derived2 ( )    {cout<<  " constructing derived " \n" ;}
      ~derived2 ( )   {cout<<  " destructing   derived " \n" ;}
};

int main ( )
{
       derived2  ob;
//construct and destruct ob
       return 0;
}

תציג את הפלט הבא:

constructing base
constructing derived1
constructing derived2
destructing   derived2
destructing   derived1
destructing   base

הכלל הכללי תקף גם במצבים של הורשה מרובה לבסיסי המחלקות ,לדוגמה התוכנית הבאה:



#include <iostream.h>

class base1 {
public:
       base1( )    {cout<<  " constructing base1 " \n" ;}
      ~base1 ( )   {cout<<  " destructing   base1 " \n" ;}
};

class base
public:
       base2 ( )    {cout<<  " constructing base2 " \n" ;}
      ~base2 ( )   {cout<<  " destructing   base2 " \n" ;}
};

class derived : public base1 , public base2  {
public :
       derived ( ) {cout <<  " constructing derived \n " ;  }
       ~derived ( ) {cout << " destructing   derived \n " ; }
};

int main ( )
{
       derived ob;
//construct and destruct ob
       return 0;
}

תציג את הפלט הבא:

constructing base1
constructing base2
constructing derived
destructing   derived
destructing   base2
destructing   base1



הכלל הכללי תקף גם במצבים של הורשה מרובה לבסיסי המחלקות ,לדוגמה התוכנית הבאה:


#include <iostream.h>

class base1 {
public:
       base1( )    {cout<<  " constructing base1 " \n" ;}
      ~base1 ( )   {cout<<  " destructing   base1 " \n" ;}
};

class base{
public:
       base2 ( )    {cout<<  " constructing base2 " \n" ;}
      ~base2 ( )   {cout<<  " destructing   base2 " \n" ;}
};


class derived : public base1 , public base2  {
public :
       derived ( ) {cout <<  " constructing derived \n " ;  }
       ~derived ( ) {cout << " destructing   derived \n " ; }
};

int main ( )
{
       derived ob;
//construct and destruct ob
       return 0;
}


תציג את הפלט הבא:

constructing base1
constructing base2
constructing derived
destructing   derived
destructing   base2
destructing   base1

כפי שאתה שם לב פונקציות הבנאים נקראים לפי הסדר המקורי,והפונקציות ההורסות נקראות בסדר הפוך,מימין לשמאל .זה אומר ש base2 מצוין לפני base1 ברשימת derived הנגזרת כפי שנראה כאן:

class derived : public base2 , public base1  {

אז הפלט של התוכנית יראה כך:


constructing base2
constructing base1
constructing derived
destructing   derived
destructing   base1
destructing   base2
הקודם
הבא