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

 

קריאה לפונקציות וירטואליות דרך מחלקת בסיס

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

 
/* here ,a base class reference is used 
/* to access a vitual  function.

#include  < iostream >
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:
       void vfunc ( ) {
           cout << "this is derived2's vfunc ( ) .\n ";       
       }
};
//use a base class reference parameter .
void  f (base &r) {
       r.vfunc ( );
}
int main ( ) 
{       
       base b;
       derived1 d1;
       derived2 d2;
       f(b); //pass a base object to f ( ) .
       f(d1); //pass a derived1 object to f ( ).
       f(d2); //pass a derived2 object to f ( ).
       return  0;
}


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

 

התכונה הוירטואלית בהורשה.

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

 
#include  < iostream >
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 " ;
       }
};

//derived2 inherits  virtual function vfunc ( )
// from derived1.
class derived2 :public derived1 {
public:
//vfunc ( ) is still virtual 
       void vfunc ( ) {
           cout << "this is derived2's vfunc ( ) .\n ";
       }
};

//use a base class reference parameter .
void  f (base &r) {
       r.vfunc ( );
}
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 ( ) ;//access derived2's vfunc ( )
       return 0 ;

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

This is base's vfunc ( ).
This is derived1's vfunc ( ).
This is derived2's vfunc ( ).
 
הקודם
הבא