4.3.4. סמנטיקת ערכים, Coercion, Polymorphism

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

הורשה בשפת C++ מגדירה coercion בין המחלקה הנורשת אל  מחלקת הבסיס. ה-coercion הוא Parametric – מוגדר אוטומטית לכל תתי הסוגים. ה-coercion נעשה על ידי שליפת תת אובייקט (sub object) מתוך האובייקט המקורי.



מהו תת אובייקט?

class Base

{

      // ...

};

class Derived: public Base

{

      // ...

};

לכל אובייקט של המחלקה Derived יש תת אובייקט שהוא מהמחלקה Base. במקרים רבים נרצה להתייחס אל תת-אובייקט זה.

אם Manager יורש מ-Employee, אז יש לו חלק משותף ל-Employee.

Employee E;

Manager M;

E = M;      // OK – valid coercion

M = E;            // Error – No coercion is defined

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



מאת: ניצן

Borland style vptr

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