繁体   English   中英

我已将人员类继承到员工和经理中,但无法打印从人员类方法调用的人员类成员,为什么?

[英]I have inherited person class into employee and into manager but can't print members of person class that called from person class method why?

我创建了 person 、 employee 、 manager 类并在多级继承,但是当我从 manager 类调用 print 方法时,该类调用了 employee 类的 print 方法并调用了 person 类的 print 方法,但不打印 person 类的成员。

不比较输出序列,其他方法我到现在还没有实现,只是看到输出不显示 name ,gender ,age 。

#include<iostream>
#include<string>

using std::cout;
using std::cin;
using std::endl;
using std::string;

class Person
{
    short age;

    protected:
        string gender;
        string name;

    public:
        Person() {} ;
        Person(string name , string gender , short age)
        {
            this->name = name;
            this->gender = gender;
            this->age = age;

            if(gender != "male" && gender !="female")
            {
                this->gender = "other";
            }
        }

        void print()
        {
            cout<<name<<" "<<gender<<" "<<age<<" ";
        }
};

class Employee : public Person
{
    int yearly_salary;

    protected:
        static string employee_id;
        string employee_since;
        string designation;
        string department;

    public:
        Employee() {};
        Employee(string name,string gender,short age,string department,string designation,string employee_since,int yearly_salary)
        {
            Person(name,gender,age);
            this->yearly_salary = yearly_salary;
            this->employee_since = employee_since;
            this->designation = designation ;
            this->department = department ;
        }

        void print()
        {
            cout<<employee_id<<" ";
            Person::print();
            cout<<department<<" "<<designation<<" "<<employee_since<<" "<<yearly_salary<<"\n";
        }

        void increment(float percent)
        {
            yearly_salary += ((yearly_salary*percent)/100.0);
        }
};

string Employee::employee_id = "E1";

class Manager : public Employee
{
    protected:
        Employee *direct_reports[10];
        int direct_reports_count;

    public:
        Manager(const Employee& employee)
        {
            direct_reports_count = 0;
            Employee manager = employee;
        }

        void print()
        {
            for(int i=0;i<direct_reports_count;i++)
            {
                (direct_reports[i])->Employee::print();
            }
        }

        void add_direct_report(Employee *employee)
        {
            direct_reports[direct_reports_count] = employee;
            direct_reports_count++;
        }

        void change_designation(string existing_designation,string  new_designation)
        {

        }

        void increase_salary(string desgnitaion,float percent)
        {

        }
};

int main() {
    string name, gender, department, designation, employee_since;
    short age;
    int yearly_salary;
    cin >> name >> gender >> age >> department >> designation;
    cin >> employee_since >> yearly_salary;
    Employee employee(name, gender, age, department, designation,
                      employee_since, yearly_salary);
    Manager manager(employee);

    int direct_reports_count = 0;
    cin >> direct_reports_count;

    Employee *employee_ptr;
    for(int i = 0; i < direct_reports_count; i++) {
        getchar(); // removing newline from input buffer
        cin >> name >> gender >> age >> department >> designation;
        cin >> employee_since >> yearly_salary;
        employee_ptr = new Employee(name, gender, age, department,
                                    designation, employee_since,
                                    yearly_salary);
        manager.add_direct_report(employee_ptr);
    }

    getchar(); // Removing newline from input buffer
    string existing_designation, new_designation;
    cin >> existing_designation >> new_designation;
    manager.change_designation(existing_designation, new_designation);

    float increment_percentage;
    cin >> designation >> increment_percentage;
    manager.increase_salary(designation, increment_percentage);

    manager.print();

    return 0;
}

输入 :

Reshma female 40 Engineering SeniorManager 1-1-1997 3000000
3
Rachit male 28 Engineering JuniorDeveloper 10-07-2013 1200000
Rahi female 32 Engineering SeniorDeveloper 2009 1800000
Raman male 34 Engineering Developer 07-10-2010 1600000
Developer SeniorDeveloper
SeniorDeveloper 5.5

我想要的输出:

E1 Rahi female 32 Engineering SeniorDeveloper 2009 1899000
E1 Raman male 34 Engineering SeniorDeveloper 07-10-2010 1688000
E1 Rachit male 28 Engineering JuniorDeveloper 10-07-2013 1200000

我得到了什么:

E1  0 Engineering JuniorDeveloper 10-07-2013 1200000
E1  0 Engineering SeniorDeveloper 2009 1800000
E1  0 Engineering Developer 07-10-2010 1600000

在您的构造函数中:

Employee(string name,string gender,short age,string department,string designation,
         string employee_since,int yearly_salary) {
    
    Person(name,gender,age);  // doesn't do anything
    // ...
}

第一行实际上并没有调用Person构造函数,它只是创建了一个被丢弃的临时对象,因此您只是看到正在打印的默认值。 这些是namegender空字符串。 (请注意,不能保证age为 0,因为它未初始化,这会调用未定义的行为。)

调用基类构造函数的正确方法是使用成员初始值设定项列表:

Employee(string name,string gender,short age,string department,string designation,
         string employee_since,int yearly_salary)
 : Person(name,gender,age) {
  // ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM