5

我有一个处理继承的任务。

我有一个 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()) +"}";
}
4

5 回答 5

3

你想要的是一个指针数组:

Employee *staff[4];

现在您可以分配指向 Employee 的指针,从而将指向 Employee 子级的指针分配给它:

staff[0] = new Manager("IT", 100, "MF1", "ML1");

然后你可以调用 Employee 的函数:

staff[0]->toString();
于 2013-02-21T02:14:38.563 回答
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
};
于 2013-02-21T02:15:33.390 回答
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();

完毕。

于 2013-02-21T02:19:51.977 回答
1

我无法存储指向Manager我不认为的对象的指针

是的你可以。或者至少,您可以拥有一个指向 typeEmployee*对象的指针Manager。毕竟,Managers Employees(这就是你的继承所说的),所以这是有道理的。

由于您的toString()函数被标记为virtual并覆盖其实现,因此当通过 type 的指针在 typeManager的对象上调用时,将选择的专门实现。ManagerEmployee*Manager

另一方面,以下内容不会编译(您正在将对象值分配给指针值):

staff[0] = *e;

所以不要尝试。相反,使用这个:

staff[0] = new Manager(...);
...
staff[0]->toString();

最后一点,当你使用原始指针时,不要delete在它们超出范围之前忘记它们,否则你会出现内存泄漏。事实上,您应该考虑使用智能指针,它会自动处理对象的生命周期。

于 2013-02-21T02:16:26.833 回答
1

看来您的类是继承,而不是数组,所以我将只使用向量..

std::vector<Employee*> staff;

staff.push_back(new Manager);
staff.push_back(new Intern);

您现在有一个充满Employee指针的数组。的toString()方法Employee是虚拟的,因此这将调用您分配的每个对象Manager的成员方法。Intern

staff[0]->toString(); // Manager toString()
staff[1]->toString(); // Intern toStrin()

完成后记得释放内存!

于 2013-02-21T02:26:37.900 回答