שאלה כללית לגבי פולימורפיזם

7 views
Skip to first unread message

itai druker

unread,
Feb 17, 2012, 8:27:24 AM2/17/12
to 83-223
לגבי ה-Vtable
אם יש לי:
A
B היורש מ-A
C היורש גם מ-B וגם מ-A

אם ב-A יש פונקציה וירטואלית f
וגם ב-B יש פונקציה וירטואלית f
ב-C לעומת זאת אין
מה אני רושם ב-vtable של C?
בעיקרון בדקתי ב-visual וראיתי שזה הפונקציה של A
אבל למה?

Matan Keidar

unread,
Feb 17, 2012, 8:32:17 AM2/17/12
to 83-...@googlegroups.com
קצת מוזר לי מכיוון שיש כאן דו משמעות במחלקה C.
אם אתה רוצה להפעיל את f מתוך C אז צריך לדעת לאיזה "אבא" אתה מתכוון.
בלי שום קשר, בדקתי את זה עם ++g וזו שגיאת קומפליציה של דו משמעות.

מתן

2012/2/17 itai druker <druk...@gmail.com>

oded pinchover

unread,
Feb 17, 2012, 8:34:45 AM2/17/12
to 83-223
אני לא בטוח אבל אולי זה כי A הכי גבוה בשרשרת המורישים??יש מישו שיודע
בוודאות?

oded pinchover

unread,
Feb 17, 2012, 8:36:27 AM2/17/12
to 83-223

זאת שאלה ממבחן שיהודה פירסם באתר...וזה הפתרון שלו יכול להיות שזה
בגלל שבמיין רשום פוינטר של A שמצביע על טיפוס מסוג C ולכן הוא בחר ככה?

tal maayan

unread,
Feb 17, 2012, 11:38:08 AM2/17/12
to 83-223
גם לי זה היה מוזר ולא ברור מאיפה הוא מתכוון להפעיל את f
ולפי התשובות אני מניחה שלוקחים את זה מ
a
כי הוא הכי גבוה בשרשרת הורשה...

itai druker

unread,
Feb 17, 2012, 12:36:15 PM2/17/12
to 83-223
מתן,
אם יש לי היררכיה של A B C
ואני עושה את הפקודה
A* a = new C
B* b = new C
האם הפקודות שקולות?
בהורשה רגילה אני באמת רואה שאין הבדל
אבל במקרה של ירושה מרובה, יש תפקיד לסוג המצביע?
אם לדוגמה יש לי את קלאס A וקלאס B שאינם יורשים מאבא משותף
ואת קלאס C שיורש גם מ-B וגם מ-A
אז כאן כן תהיה משמעות לסוג המצביע נכון?
כאילו השורות הבאות אינן שקולות
A* a = new C
B* b = new C
?
תודה

> > > בלי שום קשר, בדקתי את זה עם ++g וזו שגיאת קומפליציה של דו משמעות.-הסתר טקסט מצוטט-
>
> -הראה טקסט מצוטט-

Matan Keidar

unread,
Feb 17, 2012, 6:53:41 PM2/17/12
to 83-...@googlegroups.com
על מנת שאוכל לענות אני צריך לדעת מהי ההיררכיה של הירושה בין המחלקות המתוארות בתרחיש שלך.
באופן כללי, כמובן שיש חשיבות לסוג המצביע ואם רוצים להפעיל "גירסה" מסוימת של מתודה השייכת לכמה מחלקות בעלות אבא משותף, יש להשתמש בשם המחלקה באופן מפורש. דוגמא לכך ראינו בתרגול כאשר עברנו על הדוגמא של מסך המגע והטלפון.

2012/2/17 itai druker <druk...@gmail.com>

itai druker

unread,
Feb 18, 2012, 7:58:46 AM2/18/12
to 83-223
אז בקיצור כאשר יש לי היררכיה רגילה של A-->B--->C
ללא ירושת יהלום או כדומה
אז אין חשיבות לסוג המצביע כל עוד לא מתבצע לי Upcasting?

On 18 פברואר, 01:53, Matan Keidar <matan...@gmail.com> wrote:
> על מנת שאוכל לענות אני צריך לדעת מהי ההיררכיה של הירושה בין המחלקות
> המתוארות בתרחיש שלך.
> באופן כללי, כמובן שיש חשיבות לסוג המצביע ואם רוצים להפעיל "גירסה" מסוימת של
> מתודה השייכת לכמה מחלקות בעלות אבא משותף, יש להשתמש בשם המחלקה באופן מפורש.
> דוגמא לכך ראינו בתרגול כאשר עברנו על הדוגמא של מסך המגע והטלפון.
>

> 2012/2/17 itai druker <druke...@gmail.com>

> > > -הראה טקסט מצוטט--הסתר טקסט מצוטט-
>
> -הראה טקסט מצוטט-

Matan Keidar

unread,
Feb 18, 2012, 8:41:00 AM2/18/12
to 83-...@googlegroups.com
אתה מתכוון: כל עוד לא מתבצע downcasting.
upcasting זה התהליך הרצוי, פוינטר של אבא שמצביע לאובייקט של בן.
כן יש חשיבות לסוג המצביע, מכיוון שהפונקציות אשר איתן אתה יכול לעבוד הן אותן הפונקציות אשר הפוינטר מכיר. אם B יגדיר פונקציה וירטואלית חדשה ו-C ישנה את המימוש שלה, אם תעבוד עם פוינטר מסוג A אז לא תהיה לך גישה לפונקציות האלה.

2012/2/18 itai druker <druk...@gmail.com>

Eliyahu Stern

unread,
Feb 18, 2012, 1:19:01 PM2/18/12
to 83-...@googlegroups.com
לגבי הvtable -
אם אתם מדברים על השאלה שאני חושב שאתם מדברים עליה, קימפלתי גם בויז'ואל וגם בg++.
 כמו שמתן אמר, בg++ יש כפל משמעות, והויז'אל מריץ כמו שאיתי אמר. (אני מקווה שיהודה שם לב שיש בזה הבדל בין קומפיילרים.)
הנקודה היא שבויז'אל כתוב על המצביע לvtable שזאת טבלה "for A", כלומר, אם אני מבין נכון, טבלה של C שמיועדת למצביע לA.
Reply all
Reply to author
Forward
0 new messages