שלום לכולם,
בזמן שאני לומדת לראיונות ניתקלתי בשאלה הבאה:
ידוע שכאשר מגדירים פונקציה במחלקה כpure virtual אז המחלקה הופכת להיות אבסטרקטית. היא מכילה חתימות של פונקציות ויש לממש יורש למחלקה שיממש את הפונקציות הpure virtual.
ככל שידוע לי כשפונקציה מוגדרת וירטואלית או וירטואלית טהורה אז ההחלטה לאיזה פונקציה לגשת נעשית בזמן ריצה.
אבל עוד בזמן קומפילציה הקומפיילר יזהה אם לא מימשת את הפונקציות הטהורות.
כאן מגיעה השאלה שלי: מה קורה בזמן ריצה ומה קורה בזמן קומיפלציה?
בזמן קומפילציה יש בדיקה האם כל המתודות ממושו (גם ללא יצירת Instance של האוביקט) ובזמן ריצה מחשובות רק הV-Tables? כלומר בזמן ריצה מחושב רק לאיזה פונקציה לגשת?
תודה!
לפני 8 שנים
ע"י: 1_אורח_כללי
לזמן קומפילציה
"הקומפיילר עובר על האובקטים שעושים להם instance, ועבורם ממלא את ה"חורים" בV-tables
המשפט הזה לא נכון הלינקר יעבור על החורים וימלא אותם ללא קשר לINSTANCE אם הוא לא ימצא דרך למלא אז הוא יצעק על זה.
זה שאת יוצרת INSTANCE פשוט יוצר "חור" בקוד
אני מקווה שזה ענה לך אם לא תכנסי לhttp://www.tenouk.com/ModuleW.html
משם אני למדתי
בהצלחה
מחפש עבודה צריך שלושה דברים - לדעת לשווק את עצמו, לדעת להגיע למשרות ולדעת להשתפר מתהליך לתהליך.
לבדיקת התאמה
לפני 14 שנים
ע"י: סטודנטית123
תודה, נראה לי שסוף סוף הבנתי:
זמן קומפילציה: הקומפיילר עובר על כל המחלקות, ועבור כל אחת יוצר V-Table. עבור מחלקות אבסטרקטיות רושם 0 בכתובת של הפונקציה ה Pure virtual. עבור מחלקות שיורשות מהבסיס, משאיר "חור" למלא ככתובת הפונקציה.
בזמן linking, הקומפיילר עובר על האובקטים שעושים להם instance, ועבורם ממלא את ה"חורים" בV-tables. ממלא את כתובת הפונקציות הממומשות של המחלקות.
בזמן ריצה: יוצר מצביע בין האוביקט שעשו לו Instance לבין טבלת ה Vtable של המחלקה שלו. כך הוא יודע "לקפוץ" למימוש הנכון של הפונקציה.
Linking נחשב חלק מזמן קומפילציה או מזמן ריצה?
לפני 14 שנים
ע"י: 1_אורח_כללי
תשובה ראשונה : "החורים" שממלאים הם ב V-TABLE
למה צריכים V-TABLE ?
למימוש פולימורפיזם נניח שיש לך CLASS SHAPE ויורשים ממנו SQUARE וCIRCLE
בSHAPE קיימת המתודה AREA שהיא וירטואלית טהורה ,שמחזירה את השטח של כל צורה הפונקציה הזו וירטואלית.
ברגע שהצהרנו על פונקציה וירטואלית בתחילת כל אובייקט של המחלקה SHAPE יש מצביע לV-TABLE ששם יש מצביע לפונקציה AREA איפה שהיא ממומשת מכיוון שלא מימשנו אותה תיהיה לנו כתובת 0 מה שמכריח את שאר המחלקות היורשות לממש את הפונקציה הזאת, SQUARE וCIRCLE יש מצביע לטבלה הוירטואלית של המחלקה שלהם ברגע שנממש אותם הכתובת שם תתמלא בכתובת הפונקציה AREA (פעולת הללינקר), כעת שיש לנו מצביע פולימורפי של SHAPE ונקרא לAREA הוא יפנה לטבלה הוירטואלית של המחלקה הנכונה כי האובייקט שיצרנו מסוגSQUARE\CIRCLE ביצירה שלו מעדכן את המצביע לטבלה הוירטואלית של המחלקה שלו
תשובה שנייה: לא מדוייק כי לא ננתי מקודם הסבר מלא. את לא חייבת ללמש את הפונקציה במחלקה היורשת אבל את חייבת להצהיר עליה כדי שהקומפלייר "יידע" שאת מתכוונת לממש אותה אולי המימוש פשוט יהיה בקובץ SRC אחר הוא לא יודע, ואז תתקבל שגיאת לינק , אם לא הצהרת על הפונקציה אז תיהיה שגיאת קומפלציה שתנסי ליצור INSTANCE
תשובה שלישית : כן לא מתקבל שום ERROR
לפני 14 שנים
ע"י: סטודנטית123
או.קיי בוא נעשה סדר לראות שהבנתי:
כתבתי abstract class וכתבתי class שירש ממנו ומימשתי בו את הפונקציות הוירטואליות. עכשיו אני מקמפלת ועבור על קובץ SRC נוצרים קבצי Objects עם חורים. לאחר הקמפול מתבצע הLinking שממלא חורים אלה, שהן הכתובות לפונקציות הוירטואליות שמומשו.
אז איפה נכנס התפקיד של הV-Tables?
אז אם אני כותבת abstract class וכותבת class שיורש ממנו, ולא מממשת את הפונקציות ה pure virtual, ויוצרת Instance של הclass היורש.
אז אני מקמפלת, לא מקבלת עדיין error ובשלב ה linking אני מקבלת error?
ואם אני כותבת abstract class וclass שיורש ממנו ללא מימוש הפונקציות הוירטואליות וגם לא יוצרת instance של הclass אז אני לא מקבלת error בכלל?
שוב תודה
לפני 14 שנים
ע"י: 1_אורח_כללי
בגדול ברוב הIDE (סביבות העבודה ) הLINKIN מתרחש שאת עושה BUILD אבל הוא בא אחרי תהליך הקומפילציה
לפני 14 שנים
ע"י: סטודנטית123
תודה ביסלי
מתי ה linking קורה? כשאני עושה build אז זה עובר קומפילציה, והlinking?
תודה!
לפני 14 שנים
ע"י: 1_אורח_כללי
אני מניח שאת מדברת על C++
אם לא מימשת את הפונקציה הוירטואלית אבל רק הצהרת עליה, תהיה לך שגיאת LINKING לא קומפילציה, בזמן הקומפלציה לכל קובץ SRC נוצר קובץ Objects , בקובץ הזה בין היתר מכיל "חורים" שהלינקר ימלא אח"כ מכל קבצי Objects האחרים
החורים האלה אמורים להתמלא בכתובת של הפונקציה הוירטואלית שמימשת.
עכשיו אם לא מימשת את הפונקציה עדיין לא תיזרק לך שגיאת לינקר רק אם השתמשת בפונקציה הוירטואלית הטהורה שלא מומשה עם אובייקט ממחלקת הבן אז תיזרק לך שגיאת לינקר.
מקווה שעזר לך ההסבר