C++学习笔记----------多态性与虚函数(三大特性之一)

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

多态性是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;
}

猜你喜欢

转载自blog.csdn.net/qq_43595030/article/details/92079746