継承を扱う課題があります。
Manager() と Intern() が継承する Employee() の基本クラスがあります。
私のインストラクターは私たちに次の指示を与えました:
main() で、スタッフ ポインターの配列を宣言し、次のレコードに初期化します。
Manager("IT", 100, "MF1", "ML1")
Manager("HR", 50, "MF2", "ML2")
Intern("SIUE", 0, "IF1", "IL1")
Intern("SLU", 0, "IF2", "IL2")
次に、ループして配列を表示する必要があります。彼が例として提供する出力は、子クラスに関連する特定の情報が出力されたため、 Manager() および Intern() toString() メソッドが呼び出されたに違いないことを示しています。ただし、配列にアクセスするときは、子へのポインターではなく、従業員のポインターを取得します。彼が提供したスクリーンショットを添付しました。
どうすればこれを達成できるのかわかりません。
スタッフ配列の宣言は次のとおりです。
Employee * staff = new Employee[4];
Manager() オブジェクトへのポインターを格納できません。何らかの方法がない限り、これをぶら下げることができます:
staff[0] = new Manager("IT", 100, "MF1", "ML1");
私の唯一のオプションは、このようなことをしているようです(これを1行で行うにはどうすればよいですか?):
Employee * e = new Manager("IT", 100, "MF1", "ML1");
staff[0] = *e;
しかし、明らかに今私がこれを行うとき:
cout << staff[0].toString();
子クラスではなく、基本クラスの Employee() toString() メソッドを取得します。
関連する場合に備えて、Employee() と Manager() の次の 2 つのクラス定義を次に示します。
class Employee{
private:
int eid;
string firstName;
string lastName;
public:
Employee();
Employee(int eid, string fname, string lname);
void setEID(int eid);
void setFirstName(string fname);
void setLastName(string lname);
int getEID();
string getFirstName();
string getLastName();
virtual string toString();
};
class Manager : public Employee, IPayable{
private:
string department;
public:
Manager();
Manager(string dept, int eid, string fname, string lname);
double pay();
void setDepartment(string d);
string getDepartment();
string toString();
};
そして、これが私が2つのtoString()メソッドを実装すると仮定した方法で、従業員toString()がManager()toString()内に埋め込まれています。
string Employee::toString(){
return "{eid = " + std::to_string(getEID()) + ", firstName = " + getFirstName() + ", lastName = " + getLastName() + "}";
}
string Manager::toString(){
return "Manager{" + Employee::toString() + ", department = " + getDepartment() + ", salary = " + std::to_string(pay()) +"}";
}