עבור לתוכן

vtable cpp-עזרה בשאלה(קוד)

Featured Replies

פורסם

מישהו יכול להסביר לי לגבי שאלה 2 פה:

http://www.cs.bgu.ac.il/~spl121/wiki.files/09-a.pdf

בסוף הקוד כתוב:

"ידוע כי הפלט של הרצת התוכנית הינו :...."

עכשיו השורה האחרונה(השלישית-

ColorPrinter printing ColorImage) ברור לי למה היא מודפסת- כי בשורה האחרונה של dowork עשינו print על תמונה צבעונית.

אבל מדוע מודפסים גם 2 השורות הראשונות?

פורסם
  • מחבר

אולי אני לא מבין מה המשעמות של שורות הקוד הבאות ב- do work.

האם אין הכוונה שנפעיל על p שהוא אובייקט מטיפוס printer את המתודה print של printer או שיש משהו שאני אל מבין והכוונה היא שנדפיס את את המתודה print שלimage??

 ColorPrinter p;  
Image *colorImg = new ColorImage(); Image *colorImg = new ColorImage();
p.print(colorImg);

גם הפתרון לסעיף א שלהם לא ברור:

ColorPrinter -- -- print

Printing is not supported

לא אמור להיות מודפס גם colorPrinter printing colorimage?

http://www.cs.bgu.ac.il/~spl121/wiki.files/09-a-solution.pdf

פורסם

ערוך בבקשה את הכותרת למשהו יותר אינפורמטיבי.

פורסם
  • מחבר

נערך

פורסם

ל-Printer יש שלוש פונקציות בשם Print: אחת שמקבלת *Image, אחת שמקבלת *BWImage ואחת שמקבלת *ColorImage.

המשתנה colorImg הוא מטיפוס Image, ולכן כשעושים (p.print(colorImg נקראת הפונקציה הראשונה (זו שמקבלת *Image) - הרי הקומפיילר לא יודע בזמן הזה מה הטיפוס המדויק של האובייקט ש-colorImg מצביע אליו.

כיוון שהיא וירטואלית, הפונקציה שנקראת היא זו של ColorPrinter. תנסה לחשוב מכאן הלאה מה בדיוק קורה.

תחשוב בכל שלב בדיוק מה הטיפוס של הפרמטר שמועבר לפונקציות print השונות (לא הטיפוס של האובייקט אליו הוא מצביע, אלא הטיפוס של המשתנה עצמו).

פורסם
  • מחבר

"

המשתנה colorImg הוא מטיפוס Image, ולכן כשעושים (p.print(colorImg נקראת הפונקציה הראשונה (זו שמקבלת *Image) - הרי הקומפיילר לא יודע בזמן הזה מה הטיפוס המדויק של האובייקט ש-colorImg מצביע אליו. "

כאן בדיוק הבעיה שלי, למה כאן אין את העניין שההחלטה היא בזמן ריצה על סמך הטיפוס ש colorimage* מצביע עליו??

נכון שהמצביע הוא מטיפוס Image אך לפי מה שהבנתי שלמדנו בכל זאת, ההחלטה נעשית בזמן ריצה לפי הערך שעליו מצביע המצביע(ColorImage טיפוס) ולא לפי טיפוס המצביע(טיפוס Image)....

מדוע p.print לא מתבצעת לפי הטיפוס האמיתי שהוא מחזיק(תמונה צבעונית) ? באיזה מקרים זה כן יהיה כך(/מה צריך לשנות כדי שכן יעבוד כך..?)

פורסם

אל תעתיק את מה שכתבתי, תשתמש בכפתור ציטוט.

ההחלטה בזמן ריצה רלוונטית להורשה, ולא לפרמטרים המועברים לפונקציה - הם מפורשים בזמן הקומפילציה. זה ההבדל בין דריסה (overriding) והעמסה (overloading). פונקציות וירטואליות (דריסה) משוערכות בזמן ריצה, בעוד שפונקציות מועמסות משוערכות בזמן קומפילציה.

צריך לזכור דבר אחד חשוב: כשאתה מעמיס פונקציות, אין שום קשר בין ההעמסות השונות של הפונקציה פרט לשם. כלומר, הפונקציה (*Printer::print(Image והפונקציה (*Printer::print(BWImage הן פונקציות שונות לחלוטין שאין ביניהן קשר, ובאותה מידה יכלת לתת להן שמות שונים.

כשעושים (p->print(x, הקומפיילר מוצא איזו פונקציה מבין השלוש היא המתאימה ביותר לטפל ב-x. לאחר הקומפילציה הקשר בין 3 הפונקציות "מנותק", דהיינו לא יכול להיות מצב שאתה חושב שאתה קורא לאחת מהן כשאתה למעשה קורא לאחרת.

פורסם
  • מחבר

עשית לי סדר בראש!! תודה!

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים