一、实验目的: 1、掌握继承、基类和派生类的概念。 2、掌握初始化基类成员的方法。 3、握派生类对基类的继承。 4、学习虚函数和纯虚函数的定义与使用方式。 5、理解抽象类的概念,学习如何用指针指向其他的派生类,实现多态性。 6、掌握抽象类的定义与使用方式,并注意指针的用法。 7、学习如何使用虚函数、纯虚函数、抽象类和实现类的多态性。 二、使用仪器、器材 1. 实验设备:计算机; 2. 平台:Windows 2000操作系统,Visual C++ 6.0或Microsoft Visual Studio 2005/2008/2010/2012/2013/2015/2017/2019/2022。 三、实验内容及原理 某公司的员工不超过100人,有经理(Manager)、技术人员(Technicist)和营销人员(SalsePerson)等,他们的薪金计算方法如下: (1)经理按月计酬,方法是:基本工资+奖金; (2)技术人员按月计酬,方法是:基本工资; (3)营销人员按月计酬,方法是:基本工资+销售利润*5%。 编写程序实现以下功能: (1)定义一个职工抽象类Employee,然后派生经理类Manager、技术人员类Technicist和营销人员类SalsePerson。 (2)每类人员都有职工编号、姓名、性别、入职时间、职位、基本工资等数据; (3)虚函数GetPay()实现计算各类人员的月薪; (4)虚函数ShowMessage()实现员工信息的输出; (5)实现其它的一些必要的成员函数或重载的操作符; (6)在主函数中对实现的类进行测试,首先,创建一个数组用于保存各类人员对象的指针,可以通过键盘或随机向数组中添加一些人员信息,然后通过ShowMessage函数输出员工的信息并显示当月的薪酬情况。 #include<iostream>
#include<string>
using namespace std;
class Employee
{
public:
//创建虚函数输入各员工的基本信息
virtual void input()
{
cout << "编号:\t";
cin >> num;
cout << "姓名?\t";
cin >> name;
cout << "性别?\t";
cin >> sex;
cout << "入职时间? ";
cin >> time;
cout << "基本工资? ";
cin >> bs;
}
//创建虚函数返回员工的工资
virtual double GetPay()
{ return 0.0; }
//创建虚函数输出员工的信息
virtual void ShowMessage()
{};
protected:
long num;//员工编号
string name;//员工姓名
string sex;//员工性别
string time;//入职时间
int bs;//基本工资
};
class Manager :public Employee
{
public:
void input()
{
cout << "---------------经理---------------" << endl;
Employee::input();
cout << "奖金? ";
cin >> js;
}
void ShowMessage()
{
cout << "编号:" << num << "\t姓名:" << name << "\t性别:" << sex << "\t入职时间:" << time << "\t职位:经理" << "\t基本工资:" << bs << "\t本月工资:" << GetPay() << endl;
}
double GetPay()
{
return bs + js;
}
private:
double js;//奖金
};
class Technicist :public Employee
{
public:
void input()
{
cout << "---------------技术人员---------------" << endl;
Employee::input();
}
void ShowMessage()
{
cout << "编号:" << num << "\t姓名:" << name << "\t性别:" << sex << "\t入职时间:" << time << "\t职位:技术人员" << "\t基本工资:" << bs << "\t本月工资:"<<GetPay()<<endl;
}
double GetPay()
{
return bs ;
}
};
class SalesPerson :public Employee
{
public:
void input()
{
cout << "---------------营销人员---------------" << endl;
Employee::input();
cout << "本月销售利润? ";
cin >> gain;
}
void ShowMessage()
{
cout << "编号:" << num << "\t姓名:" << name << "\t性别:" << sex << "\t入职时间:" << time << "\t职位:营销人员" << "\t基本工资:" << bs << "\t本月工资:" << GetPay() << endl;
}
double GetPay()
{
return bs + gain*0.05;
}
private:
double gain;//销售利润
};
void test()
{
Employee* a[100];//创建员工数组
//在这里输入所要创建经理类的对象
Manager a1;
//在这里输入所要创建技术人员的对象
Technicist b1;
//在这里输入所要创建的营销人员的对象
SalesPerson c1;
//在这里分别将已经创建的对象的地址赋给指针数组
a[0] = &a1;
a[1] = &b1;
a[2] = &c1;
//调用各个对象的输入函数输入人员信息,输出函数输出人员信息
a[0]->input();
a[0]->ShowMessage();
a[1]->input();
a[1]->ShowMessage();
a[2]->input();
a[2]->ShowMessage();
}
int main()
{
test();
} 四、实验过程原始数据记录  分析:由运算结果可知,通过在基类构造虚函数,在定义派生类中重写基类中的虚函数。而在test()函数中创建基类指针,将不同的派生类的地址赋给不同的指针,能够实现对派生类相应子函数的调用,进而实现程序运行时的多态。 五、实验结果及分析 总结:
- 在 C++中,基类指针可以指向派生类对象,以及基类中拥有虚函数,是支持多态性的前提。程序通过用同一个基类指针访问不同派生类的虚函数重载版本实现程序运行时的多态。C++的虚特性负责自动地在 程序运行时把基类指针的关联类型转换成当前指向对象的派生类类型运算符的左右操作数不同,须用友员函数重载。
- 抽象类机制为我们提供了软件抽象和可扩展性的手段,能够实现程序运行时的多态性。
- 我们能够通过创建指针数组,运用基类和派生类,实现创建某个类别的管理系统,虚函数的运用使程序运行更加具备条理性和逻辑性,运行更加便捷。
个人小结: 通过这次实验,我掌握了程序运行实现多态的方法,通过过在基类构造虚函数,在定义派生类中重写基类中的虚函数,在主函数中创建基类指针,将不同的派生类的地址赋给不同的指针,能够实现对派生类相应子函数的调用,进而实现程序运行时的多态。我能够区分虚函数和纯虚函数的定义方式,基类与派生类调用机制的不同,并且能够熟练地运用到程序当中。 |