דף הבית >> פונקציות וירטואליות ופולימורפיזם>>פונקציות וירטואליות>>קריאה לפונקציות וירטואליות דרך מחלקת בסיס>>>>פונקציות וירטואליות הם הירארכיות

 

פונקציות וירטואליות הם הירארכיות

מתי שפונקציה מוגדרת כוירטואלית במחלקת בסיס,היא יכולה לאכוף סמכות ע"י מחלקה נגזרת .בכל מקרה הפונקציות לא חיבות לאכוף סמכות .מתי שמחלקה נגזרת נכשלת באכיפת סמכות בפונקציה הורטואלית אז האובייקט של אותה מחלקה נגזרת בגישה לפונקציה ,הפונקציה מוגדרת ע"י מחלקת בסיס.בדוגמה בבאה הנגזרת 2 לא אוכפת את ( )vfunk

 

#include <iostream.h>
class base {
public: 
       virtual void vfunc ( ) { 
           cout <<  "this is base's vfunc ( ). \n";
       }
};
class derived1 : public base { 
public:
       void vfunc ( ) { 
           cout << " this is derived1's vfunc ( ) .\n " ;
       }
};
class derived2 :public base {                                       
public:
//vfunc ( ) not overridden by derived2 ' base is used 
};
int main ( ) 
{
       base  *p , b;
       derived1 d1;
       derived2 d2;
// point to base 
       p =&b;
       p->vfunc ( );//access base's vfunc ( )
//point to derived1
       p =&d1;
       p->vfunc ( ); //access derived1's vfunc ( )
//point to derived2
       p =&d2;
       p->vfunc ( ) ;//use base 's   vfunc ( )
       return 0 ;
}

כפי שציפינו התוכנית הוציאה את הפלט הבא :

This is base's vfunc ( ).

This is derived1's vfunc ( ).

This is base's vfunc ( ).
 

מכוון שהנגזרת השניה לא לוקחת סמכות על ( ) vfunk הפונקציה מוגדרת ע"י מחלקת בסיס מתי שהפונקציה ( ) vfunc מיוחסת קרובה לאובייקט מסוג נגזרת2. המשך התוכנית תדגים מקרה מיוחד של כלל כללי.בגלל שירושה היא היררכית בשפת++c ,יש בזה הגיון שפונקציות וירטואליות גם היררכיות. זה אומר שאם הנגזרת לא לוקחת סמכות על הפונקציה הוירטואלית ,ההגדרה הראשונה שנמצאת ברברס (בחזרה לאחור באותו סדר) משתמשים בה.כמו בדוגמה הבאה נגזרת2 נגזרת מנגזרת1,אשר נגזרת ממחלקת בסיס,בכל מקרה נגזרת2 לא לוקחת סמכות על על ()vfunc,זה אומר שהגירסה הכי קרובה לפונקציה ( )vfunk ,לכן ( )deived1::vfunk זה בשימוש כאשר אובייקט מסוג נגזרת2קורא ל ()vfunc .


#include <iostream.h>
class base {
public: 
       virtual void vfunc ( ) { 
           cout <<  "this is base's vfunc ( ). \n";
       }
};

class derived1 : public base { 
public:
       void vfunc ( ) { 
           cout << " this is derived1's vfunc ( ) .\n " ;
       }
};
                                                                                                                                                   
class derived2 :public derived1 {
public:
//vfunc ( ) not overridden by derived2 .
//in this case 'since derived2 is derived from derived1,
//derived1 vfunc ( ) is use.
};

int main ( ) 
{
       base  *p , b;
       derived1 d1;
       derived2 d2;
// point to base 
       p =&b;
       p->vfunc ( );//access base's vfunc ( )
//point to derived1
       p =&d1;
       p->vfunc ( ); //access derived1's vfunc ( )
//point to derived2
       p =&d2;
       p->vfunc ( ) ;//use derived's   vfunc ( )
       return 0 ;
}

כפי שציפינו התוכנית הוציאה את הפלט הבא :

 

This is base's vfunc ( ).

This is derived1's vfunc ( ).

This is derived1's vfunc ( ).

הקודם
הבא