我有一个处理继承的作业。
我有一个Employee()基类,Manager()和Intern()继承自。
我的导师给了我们以下指示:
在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");
似乎我唯一的选择是做这样的事情(我将如何在一行中做到这一点?):
Employee * e = new Manager("IT", 100, "MF1", "ML1");
staff[0] = *e;
但显然现在我这样做了:
cout << staff[0].toString();
我将获得基类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();
};
以下是我假设我将实现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()) +"}";
}
答案 0 :(得分:3)
你想要的是一个指针数组:
Employee *staff[4];
现在您可以为Employee指定指针,因此指向Employee的子指向它:
staff[0] = new Manager("IT", 100, "MF1", "ML1");
然后你可以调用Employee的函数:
staff[0]->toString();
答案 1 :(得分:2)
这是一种方式:
Manager manager1("IT", 100, "MF1", "ML1");
Manager manager2("HR", 50, "MF2", "ML2");
Intern intern1("SIUE", 0, "IF1", "IL1")
Intern intern2("SLU", 0, "IF2", "IL2")
Employee *staff[4] = {
&manager1,&manager2,&intern1,&intern2
};
答案 2 :(得分:2)
typedef std::unique_ptr<Employee> EmployeePtr;
typedef std::array<EmployeePtr,4> Employees;
Employees employees =
{
new Manager("IT", 100, "MF1", "ML1"),
new Manager("HR", 50, "MF2", "ML2"),
new Intern("SIUE", 0, "IF1", "IL1"),
new Intern("SLU", 0, "IF2", "IL2")
};
存储。还有什么?如何访问。
employees[0]->toString();
完成。
答案 3 :(得分:1)
我无法存储指向
Manager
对象的指针,我不认为
是的,你可以。或者至少,您可以使用类型为Employee*
的指针,该指针指向类型为Manager
的对象。毕竟,Manager
s 是 Employees
(这是你的继承所说的),所以这是有道理的。
由于您的toString()
函数被标记为virtual
,并且Manager
会覆盖其实现,因此当通过类型{{1}的指针在Manager
类型的对象上调用时},将挑选Employee*
的专门实现。
另一方面,以下不会编译(您将对象值赋给指针值):
Manager
所以不要尝试。相反,使用这个:
staff[0] = *e;
最后一点,当你使用原始指针时,在它们超出范围之前不要忘记staff[0] = new Manager(...);
...
staff[0]->toString();
它们,否则你会有内存泄漏。实际上,您应该考虑使用智能指针,它会自动处理对象生存期。
答案 4 :(得分:1)
看来你的类是继承而不是数组,所以我只使用向量..
std::vector<Employee*> staff;
staff.push_back(new Manager);
staff.push_back(new Intern);
现在你有一个充满Employee
指针的数组。 toString()
的{{1}}方法是虚拟的,因此这将调用您已分配的每个Employee
和Manager
对象上的成员方法。
Intern
记得在你完成后释放你的记忆!