继承于屏幕的子类打印:父类的ostream流

问题描述 投票:0回答:1

我为这个头衔不好,我是自学成才的c ++新手。

我将Company类,Employess类和Person类一起编码为通常的示例。

基本上,我的代码应创建一个公司,向其添加员工并打印完整的员工列表。

这里是我所做的简短版本。它看起来很长,但问题只是两行。其他所有都很好,但是我需要它们以便使代码正常工作。

// g++ test.cpp  -o exe.x && ./exe.x

#include <iostream>
#include <vector>


class Person {
    private:
        std::string name;
        std::string surname;

    public:
        Person() {};
        Person(const std::string n, const std::string m) : name(n), surname(m) {}
        ~Person() {};

    friend std::ostream & operator<<(std::ostream & os, const Person & person) {
        return os << person.name << " " << person.surname;
    }
};

class Employee: public Person {
    private:
        size_t salary;

    public:
        Employee(const Person p, const size_t w) {
            salary = w;
        }
        ~Employee() {};

    friend std::ostream & operator<<(std::ostream & os, const Employee & employee) {
        std::cout << employee;                                                  // this should call std::cout from Person
        return os << ", " << employee.salary;                                   // this should also print the salary as additional info
    }
};

class Company {

    private:
        std::string companyName;
        size_t maxNumberEmployees;
        std::vector<Employee> employees;

    public:
        Company(const std::string n, const size_t p) {
            companyName = n;
            maxNumberEmployees = p;
        }

        ~Company() {
            employees.clear();
        }

        void addEmployee(const Employee employee) {
            if (employees.size() < maxNumberEmployees) {
                employees.push_back(employee);
            }
            return;
        }

        void listEmployees() const {
            for (Employee employee : employees) {
                std::cout << employee << std::endl;
            }
            return;
        }
};


int main ( int argc, char* argv[] ) {

    Company com("CompanyName", 15);

    Person per("Name1", "Surname1");
    Employee imp(per, 2000);
    com.addEmployee(imp);

    com.listEmployees();

    return 0;
}

EmployeePerson的子类。在后者中,我定义了std::cout命令应如何打印类型为Person的对象。

[当我为std::cout对象提供Employee时,我希望我的代码调用std::cout类的Person,并在Employee类中定义了附加信息。

我在遇到这些麻烦的地方加了两条评论。如果我这样运行,代码就会卡住。 std::cout << employee中肯定有错误,例如它是递归函数。但是我不知道如何以自己想要的方式解决它。

我为这个不好的称呼而道歉,我是自学成才的c ++新手。我将与Employess类和Person类一起编写Company类的常见示例。基本上我的代码应该创建一个公司,...

c++ subclass ostream
1个回答
0
投票

通常,您需要添加一个间接层。在Person中,添加虚拟功能以打印内容:

© www.soinside.com 2019 - 2024. All rights reserved.