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

מְחַבֵּר: Laura McKinney
תאריך הבריאה: 2 אַפּרִיל 2021
תאריך עדכון: 13 מאי 2024
Anonim
Relationship between Virtual Functions, Pure Virtual Functions and Abstract Classes in OOP explained
וִידֵאוֹ: Relationship between Virtual Functions, Pure Virtual Functions and Abstract Classes in OOP explained

תוֹכֶן


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

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

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

  1. טבלת השוואה
  2. הגדרה
  3. הבדלים עיקריים
  4. סיכום

טבלת השוואה

בסיס להשוואהפונקציה וירטואליתפונקציה וירטואלית טהורה
בסיסילפונקציה הווירטואלית יש את ההגדרה שלהם במחלקת הבסיס.לפונקציה וירטואלית טהורה אין הגדרה במחלקת הבסיס.
הצהרהשם פונקציה וירטואלי (parameter_list) {. . . . .};שם פונקציה וירטואלי (parameter_list) = 0;
כיתה נגזרתכל המחלקות הנגזרות עשויות לעקוף את הפונקציה הווירטואלית של מחלקת הבסיס.על כל המחלקות הנגזרות לעקוף את הפונקציה הווירטואלית של מחלקת הבסיס.
השפעה

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


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

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

הצהרה:

בסיס מחלקה {ציבורי: funt_name מסוג וירטואלי (רשימת פרמטרים) {. . . }};

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

ירושה רב-שכבתית

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


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

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

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

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

סוג וירטואלי funct_name (parameter_list) = 0;

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

שיעור מופשט

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

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

// למשל שם כיתה מופשט בכיתה {. . סוג וירטואלי funct_name (parameter_list) = 0; . . };

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

פתק:
אב הטיפוס של 'פונקציה וירטואלית' ו'פונקציה וירטואלית טהורה 'נשאר זהה בכל התוכנית.

סיכום:

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