פורסם 2012 בפברואר 2813 שנים מישהו יכול להסביר לי לגבי שאלה 2 פה:http://www.cs.bgu.ac.il/~spl121/wiki.files/09-a.pdfבסוף הקוד כתוב:"ידוע כי הפלט של הרצת התוכנית הינו :...."עכשיו השורה האחרונה(השלישית-ColorPrinter printing ColorImage) ברור לי למה היא מודפסת- כי בשורה האחרונה של dowork עשינו print על תמונה צבעונית.אבל מדוע מודפסים גם 2 השורות הראשונות?
פורסם 2012 בפברואר 2813 שנים מחבר אולי אני לא מבין מה המשעמות של שורות הקוד הבאות ב- 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
פורסם 2012 בפברואר 2813 שנים ל-Printer יש שלוש פונקציות בשם Print: אחת שמקבלת *Image, אחת שמקבלת *BWImage ואחת שמקבלת *ColorImage.המשתנה colorImg הוא מטיפוס Image, ולכן כשעושים (p.print(colorImg נקראת הפונקציה הראשונה (זו שמקבלת *Image) - הרי הקומפיילר לא יודע בזמן הזה מה הטיפוס המדויק של האובייקט ש-colorImg מצביע אליו.כיוון שהיא וירטואלית, הפונקציה שנקראת היא זו של ColorPrinter. תנסה לחשוב מכאן הלאה מה בדיוק קורה.תחשוב בכל שלב בדיוק מה הטיפוס של הפרמטר שמועבר לפונקציות print השונות (לא הטיפוס של האובייקט אליו הוא מצביע, אלא הטיפוס של המשתנה עצמו).
פורסם 2012 בפברואר 2813 שנים מחבר " המשתנה colorImg הוא מטיפוס Image, ולכן כשעושים (p.print(colorImg נקראת הפונקציה הראשונה (זו שמקבלת *Image) - הרי הקומפיילר לא יודע בזמן הזה מה הטיפוס המדויק של האובייקט ש-colorImg מצביע אליו. "כאן בדיוק הבעיה שלי, למה כאן אין את העניין שההחלטה היא בזמן ריצה על סמך הטיפוס ש colorimage* מצביע עליו??נכון שהמצביע הוא מטיפוס Image אך לפי מה שהבנתי שלמדנו בכל זאת, ההחלטה נעשית בזמן ריצה לפי הערך שעליו מצביע המצביע(ColorImage טיפוס) ולא לפי טיפוס המצביע(טיפוס Image)....מדוע p.print לא מתבצעת לפי הטיפוס האמיתי שהוא מחזיק(תמונה צבעונית) ? באיזה מקרים זה כן יהיה כך(/מה צריך לשנות כדי שכן יעבוד כך..?)
פורסם 2012 בפברואר 2813 שנים אל תעתיק את מה שכתבתי, תשתמש בכפתור ציטוט.ההחלטה בזמן ריצה רלוונטית להורשה, ולא לפרמטרים המועברים לפונקציה - הם מפורשים בזמן הקומפילציה. זה ההבדל בין דריסה (overriding) והעמסה (overloading). פונקציות וירטואליות (דריסה) משוערכות בזמן ריצה, בעוד שפונקציות מועמסות משוערכות בזמן קומפילציה.צריך לזכור דבר אחד חשוב: כשאתה מעמיס פונקציות, אין שום קשר בין ההעמסות השונות של הפונקציה פרט לשם. כלומר, הפונקציה (*Printer::print(Image והפונקציה (*Printer::print(BWImage הן פונקציות שונות לחלוטין שאין ביניהן קשר, ובאותה מידה יכלת לתת להן שמות שונים.כשעושים (p->print(x, הקומפיילר מוצא איזו פונקציה מבין השלוש היא המתאימה ביותר לטפל ב-x. לאחר הקומפילציה הקשר בין 3 הפונקציות "מנותק", דהיינו לא יכול להיות מצב שאתה חושב שאתה קורא לאחת מהן כשאתה למעשה קורא לאחרת.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.