著作権:帰属、紙ベースを作成するために他人を許可し、(同じライセンスで元のライセンス契約に基づいて用紙配布する必要がありますクリエイティブコモンズ)
多型は、のは、その使用を見て、今私達に連絡してみましょう、、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:
管理スタッフ(マネージャー)とプロジェクト開発者(Developer):ソフトウエア会社員(従業員)は、既存のスタッフの2つのカテゴリに分けることができます。現在、同社は、人事情報の一元管理のために必要があり、従業員番号が格納されている、名前、ジョブレベル、月額固定ボーナス、毎月毎月毎月の収入と毎月の収入を計算し、従業員のすべての情報を表示することができます。
8000のベース職員数、増加新しい人が注文番号1に追加されるたびにすることができます。
管理者およびプロジェクトの開発者は、ゼネラルマネージャー、部長やチームリーダーに分け三つのレベル、管理スタッフに分かれています。プロジェクト一年以上3年以上で年功序列の3年未満のために仕事の年未満のために働いに開発。
ゼネラルマネージャーの管理スタッフの最高レベル、12000元の月給、12000 *(3レベル+1)3500元の/ 3 +月額固定のボーナスの月収を計算する式。
プロジェクトの開発者、従業員の勤続年数の最高レベルが三年以上である、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;
}