所使用的开发工具及环境:PC机一套 Visual Studio 2010
实验要求:
1.硬件基本配置:Intel PentiumIII以上级别的CPU,大于64MB的内存。
2.软件要求:Window 2000操作系统,Visual Studio 6.0或更高版本开发环 境。
3.实验学时:2学时
4.实现实验内容中的题目。
5.写实验报告
实验目的:
1. 理解继承和派生的概念;
2. 理解继承在面向对象程序设计中的重要作用;
3. 掌握通过继承派生出一个新类的方法;
4. 进一步学习简单面向对象程序的编写;
实验内容:
教师干部类//50分
设计一个基类Person类,再派生出教师类(Teacher)、干部类(Cadre),再采用多重继承派生出新类:Teacher_Cadre
要求如下:
1)Person类包含:姓名、年龄、性别、地址、电话等;
在 Teacher类中新增加:title(职称) ,在 Cadre 类中新增加:post(职务) ,在 Teacher_Cadre中新增加:wages(工资)成员;
2)Person类,Teacher类,Cadre类都包含:display()函数,分别输出本类中的成员信息;
3)在Teacher类,Cadre类中的姓名、年龄、性别、地址、电话等数据成员使用相同名字,在派生类中引用这些数据成员时,采用指定作用域的方式;
4)在派生类 Teacher_Cadre 的成员函数 Show()中调用 Teacher 类中的 display()函数,输出姓名、年龄、性别、地址、电话,职称;另外同时再输出其他成员变量。
5)使用对象数组保存输入的对象;
#include
#include
using namespace std;
class Teacher
{
public:
Teacher(string n, int a, char s, string add, long int te, string ti);
void display();
protected:
string name;
int age;
char sex;
string address;
long int tel;
string title; //职称
};
class Cadre
{
public:
Cadre(string n, int a, char s, string add, long int t, string p);
void display();
protected:
string name;
int age;
char sex;
string address;
long int tel;
string post; //职务
};
class Teacher_Cadre:public Teacher, public Cadre //声明多重继承的Teacher_Cadre类
{
public:
Teacher_Cadre(string n, int a, char s, string add, long int t, string ti, string p,double w);
void show();
protected:
double wages;
};
Teacher::Teacher(string n, int a, char s, string add, long int te, string ti)
{
name = n;
age = a;
sex = s;
address = add;
tel = te;
title = ti;
}
Cadre::Cadre(string n, int a, char s, string add, long int t, string p)
{
name = n;
age = a;
sex = s;
address = add;
tel = t;
post = p;
}
void Teacher::display()
{
cout << "name: " << name << endl;
cout << "age: " << age << endl;
cout << "sex: " << sex << endl;
cout << "address: " << address << endl;
cout << "tel: " << tel << endl;
cout << "title: " << title << endl;
}
void Cadre::display()
{
cout << "name: " << name << endl;
cout << "age: " << age << endl;
cout << "sex: " << sex << endl;
cout << "address: " << address << endl;
cout << "tel: " << tel << endl;
cout << "post: " << post << endl;
}
void Teacher_Cadre::show() //在派生类Teacher_Cadre的成员函数show中调用Teacher类中的display函数
{
Teacher::display();
cout << "post: " << Cadre::post << endl; //对两个基类中的数据成员用相同的名字,在引用这些数据成员时,指定作用域
cout << "wages: " << wages << endl;
}
Teacher_Cadre::Teacher_Cadre(string n, int a, char s, string add, long int t, string ti, string p,double w):Teacher(n, a, s, add, t, ti),Cadre(n, a, s, add, t, p)
{
wages = w;
}
int main( )
{
Teacher_Cadre ct[3]={ Teacher_Cadre(“zhangsan”,18,‘M’,“chengdu”,“13256464684”,“教授”,
“书记”,10000), Teacher_Cadre(“lisi”,25,'W",“Beijing”,“17656343413”,“副教授”,“主任”,8000),
Teacher_Cadre(“wanger”,“30”,‘M’,“shandong”,“1861655156”,“讲师”,“院长”,20000)};
for(int i=0;i<3;i++)
tc[i].show();
return 0;
}
小型公司人员管理
某小型公司有四类人员: 总经理、 技术人员、 销售经理、 推销员。 设计一个基类
employee派生出 manager(总经理) 、technician(技术人员) 、salesmanager(销售经理) 、
saleman(推销员)。销售经理既是经理又是销售人员,兼具两类人员的特点,因此同时继承
manager 和salesman 两个类。 //50分
1)类定义
①employee类:
基本信息:编号、姓名、性别、出生日期、职位、薪水等;出生日期使用自定义的
Date(日期)类;其中基本信息为 private 属性,成员函数为 public 属性;多个构造函数:缺省构造函数、带参数的构造函数、带默认参数的构造函数;可以从外部访问类成员函数;
②Date 类:
成员变量:年、月、日
成员函数:SetYear(int year)、SetMonth(int month)、SetDay(int day)、GetYear()、GetMonth()、
GetDay()
③派生类 technician:新增属性:工作时间
派生类 saleman:新增属性:销售额、所属部门
2)实现人员信息的录入与显示;
3)计算并显示个人月薪:
月薪计算办法:总经理拿固定月薪 8000 元,技术人员按每小时25元领取月薪;推销员的
月薪按当月销售额的4%提成; 销售经理固定月薪5000元加所管辖部门当月销售总额的
5‰ 。
[实验提示]
① 在基类中,除了定义构造函数和析构函数,还应统一定义对各类人员信息应有的操作,
规范类族中各派生类的基本行为,但是各类人员的月薪计算方法不同,不能在基类
employee 中统一确定计算方法。各类人员信息的显示内容不同,同样不能在基类
employee中统一确定显示方法。在基类中实现上述功能的函数体应为空,在派生类中
根据同名覆盖原则
定义各自的同名函数实现具体功能。
②将基类 employee 分成两个独立文档:employee.h(类声明头文件) 和
employy.cpp(类实现文件)
② “职位”的类型设定为 int;
Employee.h
#ifndef EMPLOYEE_H private: class employee class manager:public employee class technician:public employee private: class saleman:public employee class salesmanager:public manager,public saleman #endif
#define EMPLOYEE_H
#include
#include
using namespace std;
class Data
{
public:
Data(){}
void SetYear(int year){m_year = year;}
void SetMonth(int month){m_month = month;}
void SetDay(int day){m_day = day;}
void GetYear(){cin>>m_year;cout<<“年”< Data(Data &obj)
{
m_year=obj.m_year;
m_month=obj.m_month;
m_day=obj.m_day;
}
~Data()
{cout<<"员工生日已经录入"<
int m_year;
int m_month;
int m_day;
};
{
public:
employee(){}
void get_employee()
{
cout<<“请输入编号:”;
cin>>m_ID;
cout<<“请输入姓名:”;
cin>>m_name;
cout<<“请输入性别:”;
cin>>m_sex;
cout<<“请输入生日:”;
birthday.GetYear();
birthday.GetMonth();
birthday.GetDay();
}
void display()
{
cout<<“编号”<
}
~employee()
{cout<<“员工信息已录入”<
int m_ID;
char m_name;
char m_sex;
int m_birthday;
string m_post;
int m_wages;
Data birthday;
};
{
public:
void salary()
{
cout<<“职位:经理”<
};
{
public:
technician(){} void get_technician()
{
cout<<"职位:技术人员"<
int m_time;
};
{
public:
saleman(){}
int get_saleman()
{
cout<<“职位:销售员”<
cin>>m_sales;
return m_sales;
}
void get_branch()
{
cout<<“请输入所属部门”<
}
void display()
{
cout<<“销售额:”<
void salary()
{cout<<“工资:”<
int m_sales;
string m_branch;
};
{
public:
void salary()
{
cout<<“职位:销售经理”<
cout<<“工资:”<<5000+money*0.05;
}
private:
int money;
saleman m_sales;
};
Employee.cpp
#include"employee.h"
int main()
{
cout<<"M代表总经理,T代表技术人员,SM代表销售经理,S代表推销员"<>branch;
P.display();
if(branch == "M")
{
manager M ;
M.salary();
}
else if (branch == "T")
{
technician T;
T.get_technician();
T.display();
T.salary();
}
else if (branch == "SM")
{
salesmanager SM;
SM.salary();
}
else
{
saleman S;
S.get_saleman();
S.get_branch();
S.display();
S.salary();
}
system("pause");
}
结果与分析 ( 收获、问题 )
理解了继承和派生的概念;
理解了继承在面向对象程序设计中的重要作用;
掌握了通过继承派生出一个新类的方法;
进一步学习了简单面向对象程序的编写;