כיצד ליישם פונקציה וירטואלית ב- C ++?



מאמר זה יציג בפניכם מושג תכנות נוסף שהוא פונקציה וירטואלית ב- C ++. הרעיון יתמוך בהפגנה.

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

אז בואו נתחיל במאמר זה על פונקציה וירטואלית ב- C ++





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

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

ממשיך הלאה עם מאמר זה על פונקציה וירטואלית ב- C ++



כללים לתפקוד וירטואלי ב- C ++:

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

ממשיך הלאה עם מאמר זה על פונקציה וירטואלית ב- C ++.

כיצד לסיים את תוכנת Java

מה מחייב?

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

ממשיך הלאה עם מאמר זה על פונקציה וירטואלית ב- C ++



כריכה מוקדמת

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

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

דוגמא

# כלול שימוש בכיתת מרחב השמות std בעלי חיים {פומבי: צליל ריק () {cout<< 'Genric animal sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cat meow' <צליל () // החזרת כריכה מוקדמת 0}

תְפוּקָה

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

הבהרות יוֹן
בדוגמה זו, יצרנו מצביע א 'לכיתת ההורה בעלי חיים. ואז על ידי כתיבת a = & c, המצביע 'a' התחיל להתייחס לאובייקט c של הכיתה Cats.
a -> צליל () - בעת קריאת צליל הפונקציה () הקיים בשני המחלקות על ידי המצביע 'a', הפונקציה של מחלקת ההורים נקראה, גם אם המצביע מתייחס לאובייקט של הכיתה חתולים .

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

ממשיך הלאה עם מאמר זה על פונקציה וירטואלית ב- C ++

כריכה מאוחרת

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

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

דוגמא

# כלול שימוש בכיתת מרחב השמות std בעלי חיים {ציבורי: צליל ריק וירטואלי () {cout<< 'Genric aniaml sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cats meow' <צליל () להחזיר 0}

תְפוּקָה

הֶסבֵּר
כאן צליל הפונקציה () של מחלקת הבסיס נעשה וירטואלי, ולכן המהדר מבצע כעת קישור מאוחר לפונקציה זו. כעת, שיחת הפונקציה של הפונקציה sound () תותאם להגדרת הפונקציה בזמן הריצה. מכיוון שהמהדר מזהה כעת את מצביע 'a' כמתייחס לאובייקט 'c' של המחלקה הנגזרת Cats, הוא יקרא לפונקציית sound () של Cats class.

ממשיך הלאה עם מאמר זה על פונקציה וירטואלית ב- C ++

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

פונקציה וירטואלית טהורה ב- C ++ היא פונקציה וירטואלית שאין לנו יישום לה, אנחנו רק מצהירים עליה. פונקציה וירטואלית טהורה מוכרזת על ידי הקצאת 0 בהצהרה.

צליל ריק וירטואלי () = 0

כאן סאונד () הוא פקטור וירטואלי טהור.

ממשיך הלאה עם מאמר זה על פונקציה וירטואלית ב- C ++

כיתה מופשטת

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

דוגמא

# כלול שימוש בכיתת מרחב השמות std עובד // מחלקת בסיס מופשטת {וירטואלי int getSalary () = 0 // פונקציה וירטואלית טהורה} מחלקה עובד_1: עובד ציבורי {משכורת int ציבורי: עובד_1 (int s) {משכורת = s} int getSalary () משכורת {תשואה}} שכיר עובד_2: עובד ציבורי {משכורת אינטנסיבית: עובד_2 (int t) {משכורת = t} int getSalary () {משכורת להחזר}} int ראשי () {Employee_1 e1 (5000) Employee_2 e2 (3000) int a, ba = e1.getSalary () b = e2.getSalary () cout<< 'Salary of Developer : ' << a << endl cout << 'Salary of Driver : ' << b << endl return 0 } 

תְפוּקָה

סדרת פיבונאצי c ++

הֶסבֵּר
הפונקציה 'getSalary ()' בכיתה עובד היא פונקציה וירטואלית טהורה. מכיוון שכיתת העובד מכילה את הפונקציה הווירטואלית הטהורה, לכן היא מחלקת בסיס מופשטת.
מכיוון שהפונקציה הווירטואלית הטהורה מוגדרת בכיתות המשנה, לכן הפונקציה 'getSalary ()' מוגדרת בשתי מחלקות המשנה של הכיתה עובד כלומר בעובד_1 וגם בעובד_2.

ממשיך הלאה עם מאמר זה על פונקציה וירטואלית ב- C ++

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

#include באמצעות בסיס class class std class {public: void function_1 () {cout<< 'base class function 1n' } virtual void function_2() { cout << 'base class function 2n' } virtual void function_3() { cout << 'base class function 3n' } virtual void function_4() { cout << 'base class function 4n' } } class derived : public base { public: void function_1() { cout << 'derived class function 1n' } void function_2() { cout << 'derived class function 2n' } void function_4(int x) { cout function_2 () ptr-> function_3 () ptr-> function_4 ()}

תְפוּקָה

הֶסבֵּר
עבור קריאת פונקציה פונקציה_1 (), גרסת מחלקת הבסיס של הפונקציה נקראת, פונקציה_2 () נעקפת במחלקה נגזרת ולכן גרסת המחלקה הנגזרת נקראת, פונקציה_3 () אינה נעקפת במחלקה הנגזרת והיא פונקציה וירטואלית כך שנקראת גרסת מחלקת הבסיס, באופן דומה function_4 () אינו מבוטל ולכן נקראת גרסת מחלקת הבסיס.

לפיכך הגענו לסוף מאמר זה בנושא 'פונקציה וירטואלית ב- C ++'. אם ברצונך ללמוד עוד, עיין ב מאת אדוריקה, חברת למידה מקוונת אמינה. קורס ההכשרה וההסמכה של Java J2EE ו- SOA של אדוריקה נועד להכשיר אותך לקונספטים מרכזיים של Java וגם עם מסגרות Java שונות כמו Hibernate & Spring.

יש לך שאלה עבורנו? אנא הזכיר זאת במדור התגובות בבלוג זה ונחזור אליך בהקדם האפשרי.