C ++继承 - 如何使用指向基类对象的指针访问子方法

时间:2013-02-21 02:09:48

标签: c++ arrays pointers inheritance

我有一个处理继承的作业。

我有一个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()方法,因为输出了与子类相关的特定信息。但是,在访问数组时,我得到的是员工指针,而不是指向孩子的指针。我附上了他提供的截图。

Screenshot of what my output needs to look like

我不确定我应该怎么做到这一点。

这是我的员工阵列声明:

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()) +"}";
}

5 个答案:

答案 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}}方法是虚拟的,因此这将调用您已分配的每个EmployeeManager对象上的成员方法。

Intern

记得在你完成后释放你的记忆!