5.2.2. Downcasting מול Dynamic Binding

ניתן בעזרת downcasting לכאורה לוותר על הצורך ב-dynamic binding, לדוגמא:

void draw(Shape *p)

{

      if (Circle *q = dynamic_cast<Circle *>p) {

            // Draw circle

            ...

      } else if (Line *q = dynamic_cast<Line *>p) {

            // Draw line

            ...

      } else if (Rectangle *q = dynamic_cast<Rectangle *>p) {

            // Draw rectangle

            ...

      }          

            ...

}



למרות ששיטה זו תעבוד, היא לא מומלצת. הסיבה: אם נשתמש בה, אז אם נוסיף מחלקה חדשה אל מודל המחלקות שלנו, נצטרך ללכת לכל המקומות בקוד שיש בהם if כזה, ולשנות אותם. לעומת זאת אם היינו משתמשים ב-dynamic binding לא היה צורך.

מאת: ניצן

Borland style vptr

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