C++ 实验七 继承与派生

1. 设计一个Person类,它有两个派生类Student和Employee,Employee有两个派生类Faculty和Staff。

•Person类有一个string类型的名字name,string型的身份号id,string型的电话号码phonenumber, Person类构造函数的对应name的参数不能有默认形参值。

•Student类有一个年级grade属性(Freshman、Sophomore、Junior或Senior),将属性值定义为常量;

•Employee类有一个string型的办公地点office,一个double型的月薪水salary和一个MyDate型的雇佣日期dateHired;

•Faculty类有一个级别rank属性(Professor = 3、 AssociateProfessor = 2、AssistantProfessor = 1),属性值也定义成常量。教师的薪水的计算方式为“薪水=基本工资×级别”;

•Staff类有一个职务position属性,为string类型,教工的薪水计算方式为“薪水=基本工资+津贴×工作年数”。工作年数算到2010年1月1日为止,基本工资BasicWages、津贴Allowance定义为常量。

•上述5个类都有一个print成员函数来输出该类对象除薪水外的基本信息。

 •MyDate类有year、month、day三个数据成员,有一个计算两个MyDate对象间年差的成员函数diffYear(MyDate &),年差计算只精确到月;三个数据成员的获取器函数。

2.  定义上述类,并合理地补充构造函数和其它需要的函数。在main函数中,定义一个Person类对象,一个Student类对象和一个Employee类对象一个Faculty类对象和一个Staff类对象。输出Person类及其派生类对象的基本信息,并输出Faculty类对象和Staff类对象的薪水。

 

#include <iostream>
#include <math.h>
#include <string>
using namespace std;

/* Person */
class Person
{
public:
/*
    Person(string name1,string id1,string phonenumber1)
        {name=name1;id=id1;phonenumber=phonenumber1;}
*/
    void person(string a,string b,string c)
    {
        name=a;
        id=b;
        phonenumber=c;
    }
    void print_person()
    {
        cout << "Name: "<<name << " Id: " << id << " Phonenumber: " << phonenumber << endl;
    }
    ~Person(){}
private:
    string name,id,phonenumber;
};

/* MyDate */
class MyDate
{
public:
    double diffYear(MyDate &a)
    {
        int sum;
        sum = 12 * (year-a.year-1) + fabs(12-a.month);  //¾«È·µ½ÔÂ
        return double(sum);
    }
    void Input_year(int y)
    {
        year=y;
    }
    void Input_month(int m)
    {
        month=m;
    }
    void Input_day(int d)
    {
        day=d;
    }
    int Output_year()
    {
        return year;
    }
    int Output_month()
    {
        return month;
    }
    int Output_day()
    {
        return day;
    }
    void print_MyDate()
    {
        cout << "MyDate: " << year << "/" << month << "/" << day << endl;
    }
private:
    int year,month,day;
};

/* Student */
class Student:public Person
{
public:
    Student(string a):grade(a){}
    void print_student()
    {
        cout << "grade: " << grade << endl;
    }
private:
    const string grade; 
};

/* Employee */
class Employee:public Person
{
public:
/*
    Employee(string name1,string id1,string phonenumber1,string office1,double salary1,MyDate dateHired1):Person(name1,id1,phonenumber1)
    {
        office=office1;
        salary=salary1;
        dateHired=dateHired1;
    }
*/
    void Input_office(string a)
    {
        office=a;
    }
    void Input_salary(double b)
    {
        salary=b;
    }
    void Input_dateHired(MyDate &d)
    {
        dateHired = d;
    }
    void print_employee()
    {
        cout << "office: " << office << "  ";
        cout << "雇佣日期: " << dateHired.Output_year() << "/" << dateHired.Output_month() << "/" << dateHired.Output_day() << endl;
    }
private:
    string office;
    double salary;
    MyDate dateHired;
};

/* Faculty */
class Faculty:public Employee
{
public:
    Faculty(int a)
    {
        rank = a;
    }
private:
    int rank;
};

/* Staff */
class Staff:public Employee
{
public:
    void Input_Position(string a)
    {
        position = a;
    }
    void Input_BasicWages(int b)
    {
        BasicWages=b;    
    }
    void Input_Allowance(int c)
    {
        Allowance = c;    
    }
    int Output_BasicWages()
    {
        return BasicWages;    
    }
    int Output_Allowance()
    {
        return Allowance;    
    }
    void print_staff()
    {
        cout << "Position: " << position << endl;
    }
private:
    string position;
    int BasicWages,Allowance;
};

int main()
{
    int rank1,year1,month1,day1;
    int faculty_wages,staff_wages;
    MyDate date,m1,m2;
    Person person1;
    //Person person1("HangZhou","110","10086");
    Student student1("Freshman");
    Employee employee1;
    Faculty faculty1(2);  
    Staff staff1;
    
    person1.person("HangZhou","110","10086");
    cout << "输入雇佣日期,year/month/day: " << endl;
    cin >> year1 >> month1 >> day1 ;
    date.Input_year(year1);
    date.Input_month(month1);
    date.Input_day(day1);
    employee1.Input_office("行政楼");
    employee1.Input_salary(3000.0);
    employee1.Input_dateHired(date);
    staff1.Input_BasicWages(5000);
    staff1.Input_Allowance(1000);
    cout << "输入教师级别,3/2/1: " << endl;
    cin >> rank1;
    cout << "输入教工开始工作时间(小于2010),year/month : " << endl;
    cin >> year1 >> month1 ;
    m1.Input_year(year1);
    m1.Input_month(month1);
    m2.Input_year(2010);
    m2.Input_month(1);
    faculty_wages = (staff1.Output_BasicWages()) ;
    staff_wages = staff1.Output_BasicWages() + (staff1.Output_Allowance() * (m2.diffYear(m1)/12));

    person1.print_person();      //Person
    cout << "Student: " ;        //Student
    student1.print_student(); 
    cout << "Employee:  "  ;     //Employee
    employee1.print_employee();
    cout << "教师工资: " << faculty_wages << endl;  //Faculty
    cout << "教工工资: " << staff_wages << endl;    //Staff
    return 0;
}

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。