[英]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
构造函数,它只是创建了一个被丢弃的临时对象,因此您只是看到正在打印的默认值。 这些是name
和gender
空字符串。 (请注意,不能保证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.