logo

פונקציה וירטואלית C++

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

כריכה מאוחרת או קישור דינמי

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


כללי תפקוד וירטואלי

יישר תמונה עם css
  • פונקציות וירטואליות חייבות להיות חברים במחלקה כלשהי.
  • פונקציות וירטואליות אינן יכולות להיות חברים סטטיים.
  • הגישה אליהם מתבצעת באמצעות מצביעי אובייקט.
  • הם יכולים להיות חברים של כיתה אחרת.
  • יש להגדיר פונקציה וירטואלית במחלקה הבסיסית, למרות שלא נעשה בה שימוש.
  • אבות הטיפוס של פונקציה וירטואלית של מחלקת הבסיס וכל המחלקות הנגזרות חייבים להיות זהים. אם שתי הפונקציות עם אותו שם אבל אבות טיפוס שונים, C++ יתייחס אליהן כפונקציות העמוסות מדי.
  • לא יכול להיות לנו בנאי וירטואלי, אבל יכול להיות לנו משמיד וירטואלי
  • שקול את המצב כאשר אנו לא משתמשים במילת המפתח הוירטואלית.
 #include using namespace std; class A { int x=5; public: void display() { std::cout &lt;&lt; &apos;Value of x is : &apos; &lt;&lt; x&lt;<std::endl; } }; class b: public a { int y="10;" public: void display() std::cout << 'value of is : ' <<y<<std::endl; main() *a; b b; a->display(); return 0; } </std::endl;>

תְפוּקָה:

 Value of x is : 5 

בדוגמה שלמעלה, * a הוא מצביע המחלקה הבסיסית. המצביע יכול לגשת רק לחברי מחלקת הבסיס אך ​​לא לחברי המחלקה הנגזרת. למרות ש-C++ מאפשר למצביע הבסיס להצביע על כל אובייקט שנגזר ממחלקת הבסיס, הוא אינו יכול לגשת ישירות לאיברי המחלקה הנגזרת. לכן, יש צורך בפונקציה וירטואלית המאפשרת למצביע הבסיס לגשת לחברי המחלקה הנגזרת.

דוגמה לפונקציה וירטואלית של C++

בוא נראה את הדוגמה הפשוטה של ​​פונקציה וירטואלית C++ המשמשת להפעלת המחלקה הנגזרת בתוכנית.

 #include { public: virtual void display() { cout &lt;&lt; &apos;Base class is invoked&apos;&lt;<endl; } }; class b:public a { public: void display() cout << 'derived is invoked'<<endl; int main() a* a; pointer of base b b; object derived a->display(); //Late Binding occurs } </endl;>

תְפוּקָה:

 Derived Class is invoked 

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

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

ניתן להגדיר פונקציה וירטואלית טהורה כ:

 virtual void display() = 0; 

בואו נראה דוגמה פשוטה:

דיאנה מרי שחורר
 #include using namespace std; class Base { public: virtual void show() = 0; }; class Derived : public Base { public: void show() { std::cout &lt;&lt; &apos;Derived class is derived from the base class.&apos; <show(); return 0; } < pre> <p> <strong>Output:</strong> </p> <pre> Derived class is derived from the base class. </pre> <p>In the above example, the base class contains the pure virtual function. Therefore, the base class is an abstract base class. We cannot create the object of the base class.</p></show();>

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