עבור לתוכן

אופרטור השמה בתורשה C++

Featured Replies

פורסם

שלום רב!

בקוד הבא שמתי לב שהאופרטור שווה משפיע על הפלט של התוכנית.

ממה שלמדנו, וממה שרשום בחומר, אופרטור השמה לא עובר בתורשה

וה

b1=b2

צריך פשוט לדרוס אחד את השני כמו השוואה רגילה

(עובדה שהy בפלט גם נדרס....)

אשמח להבהרות.

תודה רבה

להלן הקוד:

#include <iostream>
using namespace std;

class One
{
protected:
int x;
One(int x1)(x1)
{ cout<<"B one!"<<endl; }

One& operator = (const One& other)
{
if( this != &other )
x=other.x+10;
else
cout<<"S A!";
return *this;
}

virtual void Show ()
{
cout<<"x="<<x<<endl;
}

~One()
{ Show(); }


};

class Two:public One
{
int y;
public:
Two (int x1,int y1):One(x1),y(y1)
{
cout<<"B Two!"<<endl;
}

void Show()
{
One::Show();
cout<<"y="<<y<<endl;
}

~Two()
{ x--; Show();}

};


int main()
{
Two b1(1,2),b2(3,4);
b1=b2;
b1.Show();

}

פורסם

אופרטור הם מתודות לכל דבר. הם עוברים בירושה, ואין שום בעיה להגדיר אותם להיות וירטואליים.

הבעיה היא מהו הטיפוס של הפרמטר שמקבל =operator. האופרטור הזה צריך לקבל טיפוס הזהה לטיפוס של המחלקה, כלומר אצל One הוא מוגדר כמו שהגדרת:

One& operator = (const One& other)

ואצל Two הוא מוגדר כך:

Two& operator = (const Two& other)

גם אם אתה לא מגדיר אותו, הוא מוגדר אוטומטית.

על מנת שיעבור בירושה, הוא צריך להיות מוגדר אצל Two בדיוק כמו שהוא מוגדר ב-One, אבל אז לא תוכל להשתמש בו בשביל להשוות בין שני אובייקטים מטיפוס Two. אבל, אם תשתמש במה שהגדרת כרגע, ותגדיר את b2 להיות מטיפוס One, תראה שההשמה מעתיקה רק את x ולא את y (כי אז b1 ישתמש באופרטור= שהוא ירש מ-One, ולא בזה שהוא הגדיר בעצמו).

ארכיון

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

דיונים חדשים