טבלת מתודות וירטואלית

מתוך ויקיפדיה, האנציקלופדיה החופשית
קפיצה אל: ניווט, חיפוש

טבלת מתודות וירטואלית (virtual method table, virtual function table, virtual call table או vtable) היא מנגנון הממומש בשפות תכנות רבות שמאפשר הקצאה דינמית של שגרות (מתודות) בזמן הריצה, ולא בשלב ההידור. הודות לכך ניתן לקרוא למתודה של מחלקת האם, כשבפועל אין יודעים את המופע המדויק של האובייקט אלא בזמן הריצה, ורק בזמן הריצה ניתן לקבוע את המתודה המדויקת שתופעל.

מימוש[עריכת קוד מקור | עריכה]

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

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

טבלת מתודות וירטואלית (virtual method table, virtual function table, virtual call table או vtable) היא מנגנון הממומש בשפות תכנות רבות שמאפשר הקצאה דינמית של שגרות (מתודות) בזמן הריצה, ולא בשלב ההידור. הודות לכך ניתן לקרוא למתודה של מחלקת האם, כשבפועל אין יודעים את המופע המדויק של האובייקט אלא בזמן הריצה, ורק בזמן הריצה ניתן לקבוע את המתודה המדויקת שתופעל.

מימוש[עריכת קוד מקור | עריכה]

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

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

דוגמה[עריכת קוד מקור | עריכה]

תרשים ירושה

נניח שתוכנית מכילה מספר מחלקות היורשות אחת מן השנייה. מחלקת על Car ושתי מחלקות יורשות, Bus ו PrivateCar. המחלקה Car מגדירה מתודה וירטואלית stop. שתי המחלקות היורשות יספקו מימוש שונה למתודה. כאשר התוכנית קוראת למתודה stop מתוך מצביע מסוג Car (שיכול להצביע למחלקה מסוג Car או לשתי המחלקות שיורשות ממנה), ההחלטה לאיזה מימוש לקרוא נעשית בהתאם לטיפוס המחלקה האמיתי שהיא משויכת אליו. כיוון שטיפוס המצביע לא נקבע בזמן הקומפילציה, ההחלטה לא יכולה להתבצע בזמן זה, והיא נעשית רק בזמן הריצה.

ישנן דרכים שונות ליישום המנגנון אולם פתרון הטבלה הווירטואלית נפוץ בעיקר בסביבת C++ ושפות קשורות נוספות (כמו C#). שפות אשר מפרידות את תכנון הממשק (interface) מיישומו כמו Visual Basic וdelphi משתמשות אף הן במנגנון הטבלה הזמנית מכיוון שהיא מאפשרת לאובייקטים להשתמש במתודות שונות באמצעות סט של מצביעים.