עבור לתוכן

בעיית הורשה ב-C++

Featured Replies

פורסם

שלום לכם...

יש לי בעיה קטנה עם c++.

יצרתי שתי מחלקות, candidate ו badCandidate.

כאשר האחרונה יורשת מהראשונה.

וכאשר אני מנסה לאתחל את badCandidate בצורה הבאה:


Candidate = badCandidate(somevalues)

ואני מנסה להדפיס את ערך type (סטרינג שמוגדר לשם הקלאס) מודפס לי תו ריק (כלומר כלום).

מצורף הקוד של שתי המחלקות:


public:
Candidate();
Candidate(short,string,string,int);
Candidate(const Candidate&);
virtual ~Candidate();
virtual string getType();
short getId();
string type;
string getFName();
string getLName();
int getPVote();
friend void operator<<(ostream& os, Candidate& Candid);
bool operator<(Candidate);
bool operator==(Candidate);
friend bool operator==(short,Candidate);
bool operator!=(Candidate);
Candidate& operator=(Candidate);
protected:
string fName;
string lName;
int pVote;
short id;
};



class badCandidate:public Candidate
{
public:
badCandidate();
badCandidate(short,string,string,int);
badCandidate(const Candidate&);
virtual ~badCandidate();
string getType();
list<Contractor*> Contractors;
int kVote;
badCandidate& operator=(badCandidate);
void addContractor(Contractor*);
void removeContractor(Contractor*);
friend void operator<<(ostream&,badCandidate&);
};

והנה הבנאים:



this->lName=lName;
this->fName=fName;
this->pVote=pVote;
this->id=id;
this->type="Candidate";

כאשר הבנאי של badCandidate קורא לבנאי הזה, ולאחר מכן משנה את הטיפוס ל-badCandidate.

תודה.

פורסם

אז ככה:

1) אתה צריך להוסיף virtual למתודות כגון getType אם אתה רוצה שתהיה להם התנהגות פולימורפית (כלומר לקרוא להם דרך מצביע לאבא).

2) זה לא הקוד של המחלקות, זה רק ההצהרות, פלוס משהו שנראה כמו קוד של בנאי המחלקה, אבל קשה לדעת כי אין את החתימה. בד"כ עדיף שתפרסם את כל הקוד הרלוונטי, ולא תחסיר חלקים (לדוגמא "class", מימושים של getType והחתימות של המתודות).

3) אני לא מבין מה בדיוק אתה מנסה לעשות, אבל נראה לי שהתכנון שלך לוקה מאוד מבחינה OOP-ית. יתכן שאני טועה, כי קשה להבין מה אתה מנסה לעשות.

4) בקוד האתחול שלך אתה מבצע slicing - זו פעולה שחותכת את הבן ומציבה את השדות שאפשר להציב באבא:


Candidate cand = badCandidate( something ); // this is SLICING - additional values of badCandidate are GONE!!

Candidate* pcand = new badCandidate(something); // this is probably what you are looking for

אני ממליץ שתבלה קצת זמן בקריאת האתר הזה: http://www.parashift.com/c++-faq-lite

פורסם
  • מחבר

תודה רבה רבה על העזרה...

אני מודע לעובדה שהקוד שם דיי מגעיל פשוט אני העתקתי אותו אחרי שיניתי הרבה דברים לפתור את הבעיה הזו ללא הצלחה...

ועוד שאלה קטנה, האם ישנה דרך לעקוף את זה ללא שימוש במצביעים ?

פורסם

רפרנסים.

התנהגות פולימורפית היא דרך מצביעים או רפרנסים.

ארכיון

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

דיונים חדשים