|
דף הבית >>הורשה>>
גישה למחלקת בסיס>>הורשה
וחברים מוגנים>> הורשת
מחלקת בסיס מוגנת >>
>>פונקציות בונות הורסות
והורשה
|
פונקציות
בונות ,הורסות ,והורשה .
|
|
|
ישנם שני שאלות עיקריות
אשר מתעוררות בקשר לפונקציות בונות ופונקציות הורסות מתי שהורשה
מעורבת. השאלה הראשונה מתי הבנאי של מחלקת בסיס ,ומחלקה נגזרת
נקרא?שאלה שניה כיצד הפרמטרים יעברו לפונקציות הבנאי של מחלקת
הבסיס ? בפרק זה נתמקד בשתי שאלות אלו .
|
|
|
מתי
הפונקציות הבונות וההורסות מתבצעות.
זה אפשרי למחלקת בסיס ,למחלקה נגזרת ,או לשניהם
,להכיל פונקציות בונות ו\או הורסות. זה חשוב להבין את הסדר
שבו מבוצעות פונקציות אלו , מתי שאובייקט של מחלקה נגזרת מתקיים
ומתי שהוא יוצא מכלל קיום ,נתחיל בבחינת תוכנית קצרה זו.
|
|
|
#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
|
|
|
הקודם
|
|
הבא
|
|
|