methadonepretty
New member
הלך הפולימורפיזם
מצטער על זה שאני הולך לדבר קצת באויר, אבל אין לי אפשרות לפרוש כאן קוד (וגם השאלה עקרונית ודי ברורה). תודה על תשומת הלב בכל מקרה. מצב פשוט: יש לי מחלקת אב (B) ומחלקות נגזרות (D1 ו-D2). כדי לנצל פולימורפיזם בצורה המוכרת, ברשותי מערך של מצביעי B לאובייקטים, חלקם מסוג D1 וחלקם מסוג D2. כשאני מבצע מעבר על המערך וקורא באמצעות -> לפונקציה וירטואלית דרך כל איבר, הפונקציה שנקראת היא זו שמימשתי במחלקות D1 ו-D2, תלוי בסוג האובייקט המוצבע. So far so good. הבעיה: באחד המעברים על המערך, כשאני מנסה לקרוא לפונקציה דרך האיברים בצורה המתוארת, הפולימורפיזם פשוט לא עובד. הפונקציה שנקראת היא זו שמומשה במחלקת האב, ולא המימושים אצל המחלקות הנגזרות, למרות שמנגנון ה-virtual אמור לפעול (כל ההגדרות בקבצי ה-H תקינות). בכל שאר המעברים (בפונקציות האחרות) הכל עובד חלק. השאלה (ואני יודע שיהיה קשה לענות בלי לראות שורת קוד אחת שלי): מישהו יכול לשער מה בקוד שלי יכול לגרום למצב הזה? האם נתקלתם פעם במצב הזה, ואתם זוכרים מה היתה הטעות שלכם? אני בטוח שהטעות שלי נובעת מחוסר ניסיון או תשומת לב לפרטים קטנים, אולי כאלה שאני לא מודע להם. מדובר בפרויקט Console Application ב-Visual C++ 6. תודה מראש!
מצטער על זה שאני הולך לדבר קצת באויר, אבל אין לי אפשרות לפרוש כאן קוד (וגם השאלה עקרונית ודי ברורה). תודה על תשומת הלב בכל מקרה. מצב פשוט: יש לי מחלקת אב (B) ומחלקות נגזרות (D1 ו-D2). כדי לנצל פולימורפיזם בצורה המוכרת, ברשותי מערך של מצביעי B לאובייקטים, חלקם מסוג D1 וחלקם מסוג D2. כשאני מבצע מעבר על המערך וקורא באמצעות -> לפונקציה וירטואלית דרך כל איבר, הפונקציה שנקראת היא זו שמימשתי במחלקות D1 ו-D2, תלוי בסוג האובייקט המוצבע. So far so good. הבעיה: באחד המעברים על המערך, כשאני מנסה לקרוא לפונקציה דרך האיברים בצורה המתוארת, הפולימורפיזם פשוט לא עובד. הפונקציה שנקראת היא זו שמומשה במחלקת האב, ולא המימושים אצל המחלקות הנגזרות, למרות שמנגנון ה-virtual אמור לפעול (כל ההגדרות בקבצי ה-H תקינות). בכל שאר המעברים (בפונקציות האחרות) הכל עובד חלק. השאלה (ואני יודע שיהיה קשה לענות בלי לראות שורת קוד אחת שלי): מישהו יכול לשער מה בקוד שלי יכול לגרום למצב הזה? האם נתקלתם פעם במצב הזה, ואתם זוכרים מה היתה הטעות שלכם? אני בטוח שהטעות שלי נובעת מחוסר ניסיון או תשומת לב לפרטים קטנים, אולי כאלה שאני לא מודע להם. מדובר בפרויקט Console Application ב-Visual C++ 6. תודה מראש!