Som*_*per 5 c++ arrays inheritance pointers
我有一个处理继承的任务.
我有一个Employee()基类,Manager()和Intern()继承自.
我的导师给了我们以下指示:
在main()中声明一个staff指针数组并将它们初始化为以下记录:
Manager("IT", 100, "MF1", "ML1")
Manager("HR", 50, "MF2", "ML2")
Intern("SIUE", 0, "IF1", "IL1")
Intern("SLU", 0, "IF2", "IL2")
Run Code Online (Sandbox Code Playgroud)
然后我必须循环并显示数组.他提供的输出作为示例显示必须已调用Manager()和Intern()toString()方法,因为输出了与子类相关的特定信息.但是,在访问数组时,我得到的是员工指针,而不是指向孩子的指针.我附上了他提供的截图.
我不确定我应该怎么做到这一点.
这是我的员工阵列声明:
Employee * staff = new Employee[4];
Run Code Online (Sandbox Code Playgroud)
我不能存储指向我不认为的Manager()对象的指针.除非有某种程度上我可以扇着这个:
staff[0] = new Manager("IT", 100, "MF1", "ML1");
Run Code Online (Sandbox Code Playgroud)
看来我唯一的选择是做这样的事情(我怎么能在一行中做到这一点?):
Employee * e = new Manager("IT", 100, "MF1", "ML1");
staff[0] = *e;
Run Code Online (Sandbox Code Playgroud)
但显然现在当我这样做:
cout << staff[0].toString();
Run Code Online (Sandbox Code Playgroud)
我将获得基类Employee()toString()方法,而不是子类.
以下是Employee()和Manager()的以下两个类定义,以防它们相关:
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();
};
Run Code Online (Sandbox Code Playgroud)
以下是我假设我将实现2个toString()方法,其中Employee 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()) +"}";
}
Run Code Online (Sandbox Code Playgroud)
你想要的是一个指针数组:
Employee *staff[4];
Run Code Online (Sandbox Code Playgroud)
现在您可以将指针分配给 Employee,从而将指向 Employee 子级的指针分配给它:
staff[0] = new Manager("IT", 100, "MF1", "ML1");
Run Code Online (Sandbox Code Playgroud)
然后你可以调用 Employee 的函数:
staff[0]->toString();
Run Code Online (Sandbox Code Playgroud)