5.2.5.1. Borland

Borland C++ בחרו למקם את ה-vptr בתור השדה הראשון באובייקט.

גישה זו הינה בעייתית מול הגישה של שפת C++. מכיוון ש-vptr נמצא רק בעצמים של מחלקות שיש בהם dynamic binding, קיימת בעיה במקרים בהם מדובר במחלקה שאינה משתמשת ב-dynamic binding. הפתרון של Borland – במקרים אלו ערכו של ה-vptr הינו NULL.

חסרון בגישה זו: גם כאשר איננו משתמשים ב-dynamic binding – אנחנו משלמים במקום.

בעיה נוספת: כתובת הבסיס של האובייקט משתנה כאשר אנחנו מבצעים Upcasting.

הכתובת של p, התחלת האובייקט, משתנה כאשר מתבצע upcasting מ-Derived אל Base.

מכאן: upcasting לפי Borland – אומר שכתובת האובייקט משתנה. זה אומר שהמרות בשפת C++ הרבה יותר מסובכות מאשר בשפת C (שמה פשוט נתנו משמעות חדשה לכתובת הישנה).

נשים לב ש-casting בסגנון C לא היה עובד כאן כראוי – והיה מביא לתוצאות שגויות.

החשיבות של ההמרות: בכל פעם שעושים downcasting וקוראים לפונקציה של הבסיס, צריך לחשב את this – פגיעה בביצועי התוכנית.

מאת: ניצן

Borland style vptr

לפי מה שאני מכיר:
"חסרון בגישה זו: גם כאשר איננו משתמשים ב-dynamic binding – אנחנו משלמים במקום"
לא נכון , עבור מחלקה A שאין לה מתודות דינמיות לא יווצר כלל המצביע, ולמשל עבור מחלקה B שיורשת מA פשוט נוסיף בהתחלה את המצביע, ואחרי הבלוק של A את שאר האינפורמציה של B . וככה לא משלמים על מה שלא משתמשים ועקרונות C++ נשמרים.
מה שכן באמת הcasting קצת יותר מסובך....
שיתוף:
| עוד