c++ upcasting not work..

c++ upcasting not work..

יש לי מחלקה A ומחלקה B שיורשת מ-A.
אני לא מצליח לעשות upcasting מ-B ל-A. אשמח לעזרה:
#include <iostream>using namespace std;
class A {public: virtual void whoAmI() { cout << "A" << endl; }};class B : public A {public: void whoAmI() { cout << "B" << endl; }};int main() { A *a = new B(); a = dynamic_cast<A*>(a); // trying upcasting to A.. a->whoAmI(); // print B return(0);}
 

BravoMan

Active member
מה בדיוק לא עובד לך?

++C שלי קצת חלודה, אבל אם ציפית שקריאה ל-whiAmI תדפיס A אחרי ה-cast, זה לא מה ש-upcasting אמור לעשות.
אם אתה מחפש לעקוף את ה-vtable ולקרוא לפונקציה של מחלקת הבסיס עשה כך:
http://stackoverflow.com/a/6319619
 
לא ברור לי משהו

upcasting אמורה סה"כ להמיר את המצביע שלי למצביע האב. עד כאן אני צודק?
אם כך, לאחר ההמרה, upcasting כולו הוא מסוג A. לכן הוא כש-whoAmI יקרא, היא אמורה להדפיס A.

מה אני מפספס?
 

BravoMan

Active member
אתה מפספס משהו קטן שקרוי "פולימורפיזם"

ירושה אומרת שכל מחלקה יורשת היא "גם" מסוג מחלקת אב.
לכן, אתה יכול לפנות לאובייקט מסוג מחלקה יורשת דרך מצביע לסוג מחלקת אב, אבל הפניה הזו לא באמת משנה את סוג האובייקט אליו אתה פונה.
&nbsp
אם המתודה whoAmI היית מתודה רגילה, הגרסה שלה שהיית מקבל היית באמת לפי סוג המצביע דרכו פנית.
אבל היות והיא מתודה ווירטואלית, אתה תמיד מקבל את הגרסה של האובייקט בפועל.
זו המשמעות של הפונקציות הווירטואליות - השפה דואגת אוטומטית, בשבילך, שתמיד תקבל את הגרסה הנכונה.
&nbsp
דמיין לך מצב שיש לך מחלקות "ריבוע", "עיגול" ו-"משולש".
כולן יורשות ממחלקה "צורה" שיש לה פונקציה "צייר" שמציירת את הצורה.
&nbsp
עכשיו דמיין שיש לך מערך של צורות שונות.
אם פונקציה "צייר" לא היית ווירטואלית, היית צריך לבדוק עבור כל צורה איך לצייר אותה, ולהפעיל פונקציה שונה בהתאם.
אבל, בזכות היותה של הפונקציה ווירטואלית, הקוד להפעיל את הגרסה הנכונה שלה, יבנה מאחורי בקלעים בשבילך, בצורה אוטומטית לחלוטין.
&nbsp
קרא כאן:
http://he.wikipedia.org/wiki/פולימורפיזם_(מדעי_המחשב)
 
מה אז כן נותן לי upcasting? אם אפשר דוגמה רלונטית בבקשה

אני לא מצליח להבין אז מה כן נותן לי upcasting. ואני כביכול כרגע לא רואה בזה שום שימוש.
אשמח לדוגמה רלונטית שאראה את ה"תולעת" בה.

תודה
 

פרסאוס

New member
אסביר לך מה ההיגיון

נניח שיש לי תוכנית שקוראים לה חלונות. בתוכנית הזאת מציגים... חלונות.
אני מגדיר ממשק בסיסי לחלון וזהו. יש לך מיקום וגודל, כמה אפשרויות וזהו.
עכשיו מה עושה המתכנת שרוצה להרחיב את היכולות של המערכת?
כותב חלון משלו, עם עוד יכולות. אבל אני יכול רק לתת לו את המחלקה "חלון", איך אתמוך במחלקות שלו?
אז כך זה נעשה. התוכנית שלי קוראת לשיטות וירטואליות והוא אחראי על המימוש.
לי אין שום אפשרות לדעת מה יקרה בפועל. הקומפיילר הוא זה שמנווט את השיטות למקום הנכון.
זה מאפשר ליצור אינטגרציה. מצד אחד התוכנית שלי יודעת שהיא מקבלת "חלון" אבל למעשה היא מקבלת "בקר טקסט".
&nbsp
 
למעלה