5.2.5.1. BorlandBorland C++ בחרו למקם את ה-vptr בתור השדה הראשון באובייקט. גישה זו הינה בעייתית מול הגישה של שפת C++. מכיוון ש-vptr נמצא רק בעצמים של מחלקות שיש בהם dynamic binding, קיימת בעיה במקרים בהם מדובר במחלקה שאינה משתמשת ב-dynamic binding. הפתרון של Borland – במקרים אלו ערכו של ה-vptr הינו NULL. חסרון בגישה זו: גם כאשר איננו משתמשים ב-dynamic binding – אנחנו משלמים במקום.
מכאן: upcasting לפי Borland – אומר שכתובת האובייקט משתנה. זה אומר שהמרות בשפת C++ הרבה יותר מסובכות מאשר בשפת C (שמה פשוט נתנו משמעות חדשה לכתובת הישנה). נשים לב ש-casting בסגנון C לא היה עובד כאן כראוי – והיה מביא לתוצאות שגויות. החשיבות של ההמרות: בכל פעם שעושים downcasting וקוראים לפונקציה של הבסיס, צריך לחשב את this – פגיעה בביצועי התוכנית. |
תוכן העניינים:
קישורים רלוונטיים:שיתוף: |
Borland style vptr
לפי מה שאני מכיר:"חסרון בגישה זו: גם כאשר איננו משתמשים ב-dynamic binding – אנחנו משלמים במקום"
לא נכון , עבור מחלקה A שאין לה מתודות דינמיות לא יווצר כלל המצביע, ולמשל עבור מחלקה B שיורשת מA פשוט נוסיף בהתחלה את המצביע, ואחרי הבלוק של A את שאר האינפורמציה של B . וככה לא משלמים על מה שלא משתמשים ועקרונות C++ נשמרים.
מה שכן באמת הcasting קצת יותר מסובך....