c++实现:小型公司的信息管理系统(关于多态)

前言:

介绍员工信息:一个小型公司的人员信息管理系统
某小型公司,主要有四类人员:经理、技术人员、销售经理和推销员。现在,需要存储这些人员的姓名、编号、级别、当前薪水。计算月薪总额并显示全部信息人员编号基数为1000 每输入一个人员信息编号顺序加1,程序员要有对所有人员提升别的功能。本例中为简单起见,所有人员的初始级别均为1级。然后进行升级,经理升为4级,技术人员和销售经理升为3级,推销员仍为1级
月薪计算方法是:经理拿固定月薪8000元;技术人员按每小时100元领取月薪;推销员的月薪按该推销员当前售额的4%提成;销售经理既拿固定月薪也领取销售提成,固定月薪为5000,销售提成为所管辖部门当前销售总额的5%

一、分析题意

1.进行画图分析人员关系

注意:技术人员、经理、销售人员的基类都是Employee,SalesManager继承两个类:Manager和SalesMan,这里Employee、Manager、SalesMan、SalesManager构成菱形,形成了虚继承,所以在Manager、SalesMan继承Employee的时候应加上virtual

2.类的设计

二、创建基类--Employee

1.头文件--Employee.h

#pragma once
#include<iostream>
#include<string>
using namespace std;
class Employee
{
public:
	Employee();
	virtual ~Employee();
	//提供一个显示的初始化员工的函数
	virtual void init()=0;

	//提供员工薪资的计算方法
	virtual void getPay() = 0;

	//显示员工信息方法
	void displayStatus();

	//升级的方法
	virtual void upLevel(int level) = 0;
protected:
	string name;//姓名
	int id;//编号
	double salary;//薪资
	int level;//级别
	
	//员工的编号基础值
	static int starNum;
};
static int starNum;

2. .cpp文件--Employee.cpp

#include "Employee.h"
int Employee::starNum = 1000;
Employee::Employee()
{
	cout << "Employee()..." << endl;
	id=starNum++;
	level = 1;
	salary = 0.0;
}
Employee::~Employee()
{
	cout << "~Employee()...." << endl;
}
void Employee::displayStatus()//显示员工信息
{
	cout << "该员工的姓名为:"<<this->name << endl;
	cout << "该员工的薪资为:" << this->salary << endl;
	cout << "该员工的编号为:" << this->id << endl;
	cout << "该员工的级别为" << this->level << endl;
}

三、技术人员类--Tecnicion

1.头文件--Tecnicion.h

#pragma once
#include "Employee.h"
class Tecnicion :
    public Employee
{
public:
    Tecnicion();
    ~Tecnicion();
    virtual void init();
    virtual void getPay();
    virtual void upLevel(int level);
private:
    //一个月工作了多少小时
    int workhour;
    //每小时多少钱
    double perHourMoney;
};

2. .cpp文件--Tecnicion.cpp

#include "Tecnicion.h"
Tecnicion::Tecnicion()
{
	cout << "Tecnicion()...." << endl;
	
}
void Tecnicion::init()
{
	cout << "请输入员工的姓名:" << endl;
	cin >> name;
	perHourMoney = 100;//规定员工每小时赚100元
}
Tecnicion::~Tecnicion()
{
	cout << "~Tecnicion()..." << endl;
}
void Tecnicion::getPay()
{
	cout << "请输入该员工工作了多少小时:" << endl;
	cin >> workhour;
	this->salary = this->workhour * this->perHourMoney;
}
void Tecnicion::upLevel(int level)
{
	this->level += level;
}

三、经理类--Manger

1.头文件--Manager.h

#pragma once
#include "Employee.h"
class Manager :
    virtual public Employee
{
public:
    ~Manager();
    Manager();
    virtual void init();
    virtual void getPay();
    virtual void upLevel(int level);
protected:
    double fixSalary;
};

2.cpp文件--Manager.cpp

#include "Manager.h"
Manager::~Manager()
{
	cout << "~Manager()..." << endl;
}
Manager::Manager()
{
	cout << "Manager()..." << endl;
}
void Manager::init()
{
	cout << "请输入该经理的姓名:" << endl;
	cin >> this->name;
}
void Manager::getPay()
{
	this->salary = 8000;
}
void Manager::upLevel(int level)
{
	this->level += level;
	if (this->level == 1)
	{
		this->salary = 8000;
	}
	else if (this->level == 2)
	{
		this->salary = 10000;
	}
}

四、销售人员--SalesMan

1.头文件--SalesMan.h

#pragma once
#include "Employee.h"
class SalesMan :
    virtual public Employee
{
public:
    SalesMan();
    ~SalesMan();
    virtual void init();
    virtual void getPay();
    virtual void upLevel(int level);
protected:
    //提成的比率
    double salePercent;
    
    //当月销售额
    int saleAmount;
};

2.cpp文件--SalesMan.cpp

#include "SalesMan.h"
SalesMan::SalesMan()
{
	cout << "SalesMan()..." << endl;
	
}
void SalesMan::init()
{
	cout << "请输入销售员工的姓名:" << endl;
	cin >> this->name;
	this->salePercent = 0.04;
}
SalesMan::~SalesMan()
{
	cout << "~SalesMan()..." << endl;
}
void SalesMan::getPay()
{
	cout << "请输入当月销售额:" << endl;
	cin >> this->saleAmount;

	//计算当月的月薪
	this->salary = (this->saleAmount) * (this->salePercent);
}
void SalesMan::upLevel(int level)
{
	this->level += level;
	if (this->level == 1)
	{
		this->salePercent = 0.04;
	}
}

五、销售经理--SalesManager

1.头文件--SalesManager.h

#pragma once
#include"Manager.h"
#include"SalesMan.h"
class SalesManager:public Manager,public SalesMan
{
public:
	SalesManager();
	~SalesManager();
	virtual void init();
	virtual void getPay();
	virtual void upLevel(int level);
private:
};

2.cpp文件--SalesManager.cpp

#include "SalesManager.h"
SalesManager::SalesManager()
{
	cout << "SalesManager()..." << endl;
}
void SalesManager::init()
{
	cout << "请输入销售经理的姓名:" << endl;
	cin >> this->name;
	this->fixSalary = 5000;
	this->salePercent = 0.05;
}
SalesManager::~SalesManager()
{
	cout << "~SalesManager()..." << endl;
}
void SalesManager::getPay()
{
	cout << "请输入当月的销售额" << endl;
	cin >> this->saleAmount;
	this->salary = this->saleAmount * this->salePercent + this->fixSalary;
}
void SalesManager::upLevel(int level)
{
	this->level += level;

}

六、主函数--main.cpp

#include"Employee.h"
#include<iostream>
using namespace std;
#include<string>
#include"Tecnicion.h"
#include"Manager.h"
#include"SalesMan.h"
#include"SalesManager.h"
int main(void)
{
#if 0
	Employee* em1 = new Tecnicion;//科技人员

	em1->getPay();
	em1->upLevel(1);
	em1->displayStatus();
	delete em1;
#endif

#if 0
	Employee* em2 = new Manager;//普通经理
	em2->getPay();
	em2->upLevel(0);
	em2->displayStatus();
	delete em2;
#endif

#if 0
	Employee* em3 = new SalesMan;
	em3->upLevel(0);
	em3->getPay();
	em3->displayStatus();
	delete em3;
#endif 

#if 0
	Employee* em4 = new SalesManager;//这里会出现差错  原因:在每个类的构造函数中只能初始化对象 而不能整一些业务
	em4->init();
	em4->upLevel(1);
	em4->getPay();
	em4->displayStatus();
	delete em4;
#endif

	Employee* person_array[] = { new Tecnicion,new Manager,new SalesMan,new SalesManager };
	for (int i = 0; i < sizeof(person_array) / sizeof(person_array[0]); i++)
	{
		person_array[i]->init();
		person_array[i]->upLevel(0);
		person_array[i]->getPay();
		person_array[i]->displayStatus();
	}
	for (int i = 0; i < sizeof(person_array) / sizeof(person_array[0]); i++)
	{
		delete person_array[i];
	}
	return 0;
}

源文件:多态案例/多态案例 · 李晓蕊/project.c - 码云 - 开源中国 (gitee.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/672641.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端组件业务数据选择功能优雅写法

1. 业务场景 后台管理在实际业务中&#xff0c;经常可见的功能为&#xff1a;在当前的页面中从其他列表中选择数据。 例如&#xff0c;在一个商品活动列表页面中 需要选择配置的商品。 2. 遇到问题 从代码划分的角度来说&#xff0c;每个业务列表代码首先分散开来&#xff0…

基于Weaviate构建多模态检索和多模态检索增强(RAG): Building Multimodal Search and RAG

Building Multimodal Search and RAG 本文是学习 https://www.deeplearning.ai/short-courses/building-multimodal-search-and-rag/ 这门课的学习笔记。 What you’ll learn in this course Learn how to build multimodal search and RAG systems. RAG systems enhance an …

张大哥笔记:下一个风口是什么?

我们经常会问&#xff0c;下一个风口是什么&#xff1f;我们可以大胆预测一下&#xff0c;2024年的风口是什么呢&#xff1f; 40年前&#xff0c;如果你会开车&#xff0c;那就是响当当的铁饭碗&#xff1b; 30年前&#xff0c;如果你会英语和电脑&#xff0c;那也绝对是个人才…

SSMP整合案例第五步 在前端页面上拿到service层调数据库里的数据后列表

在前端页面上列表 我们首先看看前端页面 我们已经把数据传入前端控制台 再看看我们的代码是怎么写的 我们展示 数据来自图dataList 在这里 我们要把数据填进去 就能展示在前端页面上 用的是前端数据双向绑定 axios发送异步请求 函数 //钩子函数&#xff0c;VUE对象初始化…

RK3568笔记二十九:RTMP推流

若该文为原创文章&#xff0c;转载请注明原文出处。 基于RK3568的RTMP推流测试&#xff0c;此代码是基于勇哥的github代码修改的&#xff0c;源码地址MontaukLaw/3568_rknn_rtmp: rk3568的推理推流 (github.com) 感兴趣的可以clone下来测试。 也可以下载修改后的代码测试。Y…

VirtualBox Ubuntu系统硬盘扩容

1、关闭虚拟机&#xff0c;找到需要扩容的硬盘&#xff0c;修改为新的容量80GB&#xff0c;应用保存。 2、打开VM&#xff0c;进入系统&#xff0c;使用lsblk可以看到硬盘容量已经变为80GB&#xff0c;但硬盘根分区还没有扩容&#xff0c;使用df查看根文件系统也没有扩容。 [19…

Java八股文面试全套真题

Java八股文面试全套真题 一、Redis1.1、你在最近的项目中哪些场景使用了redis呢&#xff1f;1.2、缓存穿透1.3、布隆过滤器1.4、缓存击穿1.5、缓存雪崩1.6、redis做为缓存&#xff0c;mysql的数据如何与redis进行同步呢&#xff1f;&#xff08;双写一致性&#xff09;1.6.1、读…

微信小程序的服务调取

微信小程序的服务调取概述 微信小程序允许开发者通过网络请求与服务器进行交互&#xff0c;从而实现数据的上传和下载。这是通过小程序提供的API&#xff0c;如wx.request、wx.downloadFile、wx.uploadFile等来完成的。这些API使得小程序可以从远程服务器获取数据&#xff0c;…

打造智能化未来:智能运维系统架构解析与应用实践

在数字化转型的大背景下&#xff0c;智能运维系统成为了企业提升效率、降低成本、增强安全性的关键利器。本文将深入探讨智能运维系统的技术架构&#xff0c;介绍其核心要素和应用实践&#xff0c;帮助读者全面了解智能运维系统的概念、优势和应用价值。 ### 1. 智能运维系统的…

uniapp实现微信小程序调用云函数【vue3】

本人是从微信开发者工具写原生微信小程序一步一步走来&#xff0c;由于vue3框架的慢慢的步入前端市场&#xff0c;为了不被前端市场遗弃&#xff0c;果断从vue2开始步入vue3的学习&#xff0c;本人习惯在在HBuilder X写uniapp的项目&#xff0c;过去uniapp默认vue2框架&#xf…

MT3045 松鼠接松果

思路&#xff1a; 求x的一个区间&#xff0c;使区间中的松果的最大y坐标和最小y坐标的差至少为D。若有多个区间&#xff0c;则取最小的那个。 即使用单调队列不断维护最大值和最小值。 首先L固定不动&#xff0c;R不断右移&#xff1a; 即若函数f(R)max[L,R]-min[L,R] >…

Pytest框架中用例用例执行常用参数介绍

pytest 支持通过命令行参数来定制测试运行的方式。以下是一些常用的 pytest 执行参数介绍。 学习目录 -q 或 --quiet: 安静模式&#xff0c;只显示进度和摘要 -s : 选项允许在测试的输出中捕获 stdout 和 stderr。 -v : 选项会使 pytest 的输出更加详细。 -k &#xff1a;…

数据分析必备:一步步教你如何用Pandas做数据分析(15)

1、Pandas 数据丢失 Pandas 数据丢失的操作实例 在现实生活中&#xff0c;数据丢失始终是一个问题。机器学习和数据挖掘等领域在模型预测的准确性方面面临严重问题&#xff0c;因为缺少值会导致数据质量较差。在这些领域中&#xff0c;缺失值处理是使模型更准确和有效的主要重…

godot.bk2

1.$node_name 其实 就是 get_node 的语法糖 2.场景内部用get_node&#xff0c;场景外部用信号 这是自定义信号的绑定&#xff0c;如果是内置信号&#xff0c;直接右键点击链接到一个函数即可 3.场景切换和摄像头一直居中 4.class_name命名一个类&#xff0c;extends继承&…

【TB作品】MSP430F149,ADC采集,光强GY-30,DS18B20温度采集

功能 读取了GY-30 DS18B20 P6.0ADC P6.1ADC 显示到了LCD12864 硬件 //GY30 //SCL–P1.0 //SDA–P1.1 //VCC–3.3V //GND–GND //ADDR–不接 //DS18B20 //DATA–P1.6 //VCC–3.3V //GND–GND //ADC //DATA–P1.6 //P6.0 P6.1 ADC输入口 部分程序 #include <msp430.h>…

碰撞检测技术在AI中的重要作用

引言&#xff1a; 随着人工智能技术的不断发展&#xff0c;AI已经渗透到我们生活的方方面面。在游戏、机器人、虚拟现实等领域中&#xff0c;碰撞检测技术扮演着至关重要的角色。本文将探讨碰撞检测技术在AI中的作用&#xff0c;以及如何利用这项技术来改善AI系统的性能和用户体…

网络空间安全数学基础·环

4.1 环与子环 &#xff08;理解&#xff09; 4.2 整环、除环、域 &#xff08;熟练&#xff09; 4.3 环的同态、理想 &#xff08;掌握&#xff09; 4.1 环与子环 定义&#xff1a;设R是一非空集合&#xff0c;在R上定义了加法和乘法两种代数运算&#xff0c; 分别记为ab和a…

考研数学:有些无穷小不能用等价无穷小的公式?

今天要给大家分享的笔记是&#xff1a;《有些无穷小虽然是无穷小&#xff0c;但却不能用无穷小的相关公式》&#xff1a;

MySQL(十一) 用户管理

1.用户 1.1 用户信息 MySQL中的用户&#xff0c;都存储在系统数据库mysql的user表中 mysql> select host,user,authentication_string from user; --------------------------------------------------------------------- | host | user | authentication…

重载运算符C++---学习笔记

一、笔记 1. 重载运算符基础知识 重载运算符进行的运算和普通数的加减运算不同之处在于重载运算符的操作数为一个一个自定义的对象&#xff0c;所以相应的要对普通的运算符如-*%/的调用方法进行重写&#xff0c;重载的本质还是函数调用 2. 重载运算符的语法 重载运算符的语…