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

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)

Cyr*_* Ka 3

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

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)