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

הורשה וחברים מוגנים

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

#include <iostream.h>

class base {
protected:  
         int i , j ;  
public:
    void set  (int a , int b) {i = a ;j = b ;}
    void show ( ) { cout  <<  i  << " "<<  j  <<" \n ";  }
};
class derived : public base {
         int k ;
public:
   //derived may access base's i and j
         void setk ( ) { k = i * j }
         void showk ( )  {cout  <<  k  <<  "\n "; }
};

int main  ( )
{
         derived ob  ;
         ob.set (2 , 3 ); //ok, known to derived
         ob.show ( );  // ok, known to derived
          ob.setk ( );
          ob.showk ( );
         return 0 ;
}

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




#include  

class base {
protected:  
         int i , j ;  
public:
    void set  (int a , int b) {i = a ;j = b ;}
    void show ( ) { cout  <<  i  << " "<<  j  <<" \n ";  }
};

// i and j inherited as protected
class derived1 : public base {
         int  k ;
public:
         void setk ( ) { k = I * j }
         void showk ( )  {cout  <<  k  <<  "\n "; }
};

// i and j inherited indirectly through derived1.
class derived2 : public derived1 {
         int  m ;
public:
         void setm ( ) { m = i - j }
         void showm ( )  {cout  <<  m  <<  "\n "; }
};

int main  ( )
{
         derived1 ob1  ;
         derived2 ob2  ;
         ob1.set (2 , 3 ); 
         ob1.show ( );  
         ob1.setk ( );
         ob1.showk ( );               
         ob2.set (3 , 4 ); 
         ob2.show ( );          
         ob2.setk ( );
          ob2.setm ( );        
         ob2.showk ( );  
         ob2.showm ( );

return 0 ;
}


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


//this program won't compile.

#include <iostream.h>
class base  {
protected:
           int  i , j ;
public:
           void set ( int a ,int b )  {i = a  ;  j= b; }
           void show ( )  {cout  <<  i <<  "  "  <<  j  <<  " \n " ; }
};

// now all elements of  base are private in derived1.
class derived1 : private base  {
           int k;
public:
//this is a legal because  i and j  are private to derived1.
           void  setk ( )  {k =  i  *  j ; }  //ok
           void showk ( )  {cout<< k <<  "\n" ; }
};

//access to i  , j , set  ( ) , and show ( ) not  inherited.
class derived2 : public derived1 {
           int m ;
public:
//illegal because  i and j  are private to derived1
void setm ( ) { m =  i  -  j ;  } //error
void showm ( ) {cout << m <<  " \n " ;  }
};

int main ( )
{
   derived1  ob1; 
   derived2  ob2;
   ob1.set ( 1 , 2 ) ;  // error ,can't use set ( )
   ob1.show ( ) ;  // error ,can't use  show ( )
   ob2.set ( ) ;  // error ,can't use set ( )
   ob2.show ( ) ;  // error ,can't use show ( )
   return 0 ;
}

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

הקודם
הבא