多态性是C++语言中的一个很重要的特性,想要实现多态性那必定离不开虚函数,下面让我们一起来看看它们的使用和联系吧!
多态性与虚函数的定义及使用规则(附加纯虚函数和抽象类):
实验1:
用虚函数来实现函数的多态性:
#include<iostream>
using namespace std;
class Base
{
public:
void print()
{
cout<<"调用了基类的print函数"<<endl;
}
virtual void display()
{
cout<<"调用了基类的display函数"<<endl;
}
};
class Derived:public Base
{
public:
void print()
{
cout<<"调用了派生类的print函数"<<endl;
}
virtual void display()
{
cout<<"调用了派生类的display函数"<<endl;
}
};
int main()
{
Base *p;
Derived d1;
p=&d1;
p->print();
p->display();
return 0;
}
实验2:
某软件公司员工(Employee)可以分为现有两类人员:行政管理人员(Manager)和项目开发人员(Developer)。现在需要对公司的人员信息进行统一管理,存储人员的编号、姓名、职务级别、每月固定奖金、每月月收入和计算每月月收入,并且能够显示员工全部信息。
人员的编号基数为8000,每当新增加一个人员是编号顺序加1即可;
行政管理人员和项目开发人员均划分成三个等级,行政管理人员分为总经理、部门经理和小组长;项目开发人员分为工作时间不满一年的、工作时间超过一年不到三年的和工龄在三年以上的。
行政管理人员的最高级别为总经理,每月工资为12000元,月收入的计算公式为12000*(3-级别+1)/3+每月固定奖金为3500元。
项目开发人员的最高级别是工龄在三年以上的员工,每月工资为6000元,月收入的计算公式为6000*(3-级别+1)/3+奖金为其加班的小时数*40元/小时+每月固定奖金500元。
试编程实现上述人员管理,用虚函数实现体现出多态性。
#include <iostream>
#include <string>
using namespace std;
/*对于两类公司职员,都有其共同的特征:一个雇员的基本信息。
一个雇员的基本信息包括这个雇员的编号、姓名、职务级别、每月固定奖金和月收入信息。
所以首先声明一个公司雇员的基类Employee,包含一个基本雇员的信息,Employee类声明代码如下:*/
class Employee //定义公司雇员的基类
{
public:
Employee();//无参构造函数,系统分配空间。
Employee(string name,int number,int position);//有参构造函数,分配输入值及定义变量。
virtual void calculateMonthIncome()=0; //计算月薪虚函数
virtual void showInfo()=0; //显示雇员信息虚函数
protected:
string name; //姓名
int number; //编号
int position; //职务级别
float monthIncome; //月收入
float monthBonus;//每月固定奖金
};
Employee::Employee()
{
this->name="";
this->number=8000;
this->position=0;
this->monthIncome=0;
this->monthBonus=0;
}
Employee::Employee(string name,int number,int position)
{
this->name=name;
this->number=number;
this->position=position;
this->monthIncome=0;
this->monthBonus=0;
}
//第二,声明行政管理人员类Manager,行政管理人员类Manager声明代码如下:
class Manager: public Employee //行政管理人员类
{
public:
Manager();
Manager(string name,int number,int position);
void calculateMonthIncome();
void showInfo();
};
Manager::Manager()
{
monthBonus=3500;
}
Manager::Manager(string name,int number,int position):Employee(name,number,position)
{
monthBonus=3500;
}
void Manager::calculateMonthIncome()
{
monthIncome=12000*(3-position+1)/3+monthBonus;
cout<<"行政管理人员"<<name<<" 月收入为:"<<monthIncome<<"元"<<endl;
}
void Manager::showInfo()
{
cout<<"行政管理人员"<<name<<" 编号"<<number<<" 级别"<<position<<" 本月收入"<<monthIncome<<"元"<<endl;
cout<<endl;
}
/*第三,声明项目开发人员类Developer,项目开发人员比普通的雇员增加了加班的小时数和每月的固定奖金。
所以以Employee为基类派生出的Developer派生类中增加成员hourSalary表示每小时的加班费、workHours表示加班累计小时数。
所以项目开发人员类Developer声明代码如下:*/
class Developer: public Employee //项目开发人员类
{
public:
Developer(){workHours=0;hourSalary=40;monthBonus=500;}
Developer(string name,int number,int position);
void calculateMonthIncome();
void showInfo();
protected:
int hourSalary; //每小时的加班费
int workHours; //加班累计小时数
};
Developer::Developer(string name,int number,int position):Employee(name,number,position)
{
cout<<"请输入职员的加班累计小时数:";
cin>>workHours;
hourSalary=40;
monthBonus=500;
}
void Developer::calculateMonthIncome()
{
monthIncome=6000*(3-position+1)/3+workHours*hourSalary+500;
cout<<"项目开发人员"<<name<<" 本月收入"<<monthIncome<<"元"<<endl;
}
void Developer::showInfo()
{
cout<<"项目开发人员"<<name<<" 编号"<<number<<" 级别"<<position<<" 本月收入"<<monthIncome<<"元"<<endl;
cout<<endl;
}
void input(string &name,int &number,int &position)
{
cout<<"请输入职员的编号:";
cin>>number;
while(number<8000)
{
cout<<"输入编号错误,请重新输入!"<<endl;
cout<<"请输入职员的编号:";
cin>>number;
}
cout<<"请输入职员的姓名:";
cin>>name;
cout<<"请输入职员的级别:";
cin>>position;
}
int main()
{
string name; //姓名
int number; //编号
int position; //职务级别
Employee *p;
input(name,number,position);
Manager m(name,number,position);
p=&m;
p->calculateMonthIncome();
p->showInfo();
//m.calculateMonthIncome();
//m.showInfo();
input(name,number,position);
Developer d(name,number,position);
p=&d;
p->calculateMonthIncome();
p->showInfo();
//d.calculateMonthIncome();
//d.showInfo();
return 0;
}