עבור לתוכן

למה יש פונקציות שלא עוברות בירושה (C++)?

Featured Replies

פורסם

copy constructor

descructor

assigment operator

לא יהיו מרשות ב-סי פלוס פלוס

למה?

פורסם

אם אתה יורש מחלקה, אתה בעצם משנה אותה (יכול להרחיב וכו'), כך שהגיוני שאתה תצטרך לממש את החלקים הנ"ל שחשובים, עבור השינויים שעשית (למשל, אם הוספת משתנה למחלקה, אז ה constructor של המחלקה החדשה יצטרך לאתחל אותו וכו'). כך שאתה צריך לממש אותם ובמידת הצורך לקרוא מפורשות למתודות המקוריות (ו/או לאתחל אותם ברשימת אתחול).

פורסם

אפשר לכתוב operator= וירטואלי. זה לא בהכרח רעיון טוב (ולפעמים ממש רע).

באופן כללי כתיבת operator= נכון למחלקות לא טריויאליות היא בעיה לא פשוטה כלל.

לגבי CTOR - ב-C++ כאשר אתה יוצר אובייקט חדש אתה יודע באופן סטטי מה יהיה הטיפוס שלו. אין לך שום מצביע שממנו אתה יוצר את האובייקט החדש או את הסוג שלו. לכן ב-C++ אין משמעות למושג virtual contructor. וכמוכ שכבר צויין, ב-CTOR למחלקה יורשת צריך לפעמים "להפעיל" את ה-CTOR של האבות.

לגבי COPY CTOR - גם כאן אתה יוצר אובייקט חדש, שיכול להיות על ה-STACK, גלובלי. כשאתה יוצר אובייקט חדש הקומפיילר חייב לדעת באופן סטטי מה הטיפוס המלא שלו (על מנת להקצות מקום על ה-STACK לדוגמא). על כן ב-C++ כשמכריזים על אובייקט חדש ומפעילים COPY CTOR או CTOR השפה מחייבת אותך לציין באופן סטטי מהו הטיפוס.

אולם! במקרה הספציפי שאתה רוצה ליצור אובייקט חדש מה-heap, ויש לך מצביע לאוביקט שאינך יודע מה הטיפוס שלו, אבל אתה רוצה , אז יש פתרון ידוע ואלגנטי: על המחלקה להגדיר מתודת Clone וירטואלית. כל יורש ממש מחדש את המתודה כך שתחזיר אובייקט חדש מאותו טיפוס, אשר מכיל עותק של האוביקט המקורי. והנה לנו COPY CTOR וירטואלי.

ניתן גם לקבל משהו דומה ל-CTOR וירטואלי במידה מסויימת. קוראים לזה factory ויש הרבה וריאציות עליו.

ארכיון

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

דיונים חדשים