编写程序以演示抽象类和接口,可以从Employee类以及IPromotable和IGoodWorker接口派生出Manager类。
时间: 2024-05-29 19:09:13 浏览: 19
好的,这是一个关于程序开发的问题,我可以回答。抽象类和接口是面向对象编程中的重要概念,它们可以用来定义类的行为和特征。在这个示例中,Employee类可以被抽象为一个拥有工作能力和晋升能力的基类,IPromotable和IGoodWorker接口可以定义晋升和表现优秀的行为,Manager类可以从Employee类和这两个接口派生而来,拥有Employee类的工作和晋升能力,并且满足IPromotable和IGoodWorker接口的定义。通过这种设计,代码可以更加灵活和可扩展。
相关问题
用C++编写一个工资管理程序,将雇员类作为所有类的基类,其派生类包括经理类、销售员类、计件工类和小时工类
以下是一个简单的工资管理程序,包括一个Employee(雇员)基类和四个派生类:Manager(经理)、Salesman(销售员)、PieceWorker(计件工)和HourlyWorker(小时工)。每个类都有自己的工资计算方法和成员变量。
```
#include <iostream>
#include <string>
using namespace std;
class Employee {
public:
Employee(string name, int id) : name(name), id(id) {}
virtual double salary() const = 0; // 纯虚函数
string getName() const { return name; }
int getId() const { return id; }
private:
string name;
int id;
};
class Manager : public Employee {
public:
Manager(string name, int id, double salary) : Employee(name, id), salary(salary) {}
virtual double salary() const override { return salary; }
private:
double salary;
};
class Salesman : public Employee {
public:
Salesman(string name, int id, double sales, double rate) : Employee(name, id), sales(sales), rate(rate) {}
virtual double salary() const override { return sales * rate; }
private:
double sales;
double rate;
};
class PieceWorker : public Employee {
public:
PieceWorker(string name, int id, int pieces, double rate) : Employee(name, id), pieces(pieces), rate(rate) {}
virtual double salary() const override { return pieces * rate; }
private:
int pieces;
double rate;
};
class HourlyWorker : public Employee {
public:
HourlyWorker(string name, int id, double hours, double rate) : Employee(name, id), hours(hours), rate(rate) {}
virtual double salary() const override { return hours * rate; }
private:
double hours;
double rate;
};
int main() {
Manager m("Tom", 1001, 10000.0);
Salesman s("Jerry", 1002, 40000.0, 0.05);
PieceWorker p("John", 1003, 100, 10.0);
HourlyWorker h("Bob", 1004, 160, 20.0);
cout << "Manager " << m.getName() << " has salary " << m.salary() << endl;
cout << "Salesman " << s.getName() << " has salary " << s.salary() << endl;
cout << "PieceWorker " << p.getName() << " has salary " << p.salary() << endl;
cout << "HourlyWorker " << h.getName() << " has salary " << h.salary() << endl;
return 0;
}
```
这个程序中,Employee 类是一个抽象类,因为它包含了一个纯虚函数 salary(),没有函数体。每个派生类都必须实现它自己的 salary() 函数,否则也会成为抽象类。
四个派生类的构造函数分别需要传入不同的参数,以初始化成员变量。每个类的 salary() 函数根据不同的计算方式,返回对应的工资数额。最后在主函数中创建了四个对象,并输出它们的名字和工资。
公司雇员管理 运用C++语言描述公司类、雇员类、职务类,每一个类应包含数据成员和成员函数。设计基类和派生类
以下是一个可能的实现示例:
```c++
// 职务类
class Job {
public:
Job(const std::string& title, double salary) : title_(title), salary_(salary) {}
const std::string& GetTitle() const { return title_; }
double GetSalary() const { return salary_; }
protected:
std::string title_;
double salary_;
};
// 基类:员工类
class Employee {
public:
Employee(const std::string& name, int age, const std::string& id) : name_(name), age_(age), id_(id) {}
const std::string& GetName() const { return name_; }
int GetAge() const { return age_; }
const std::string& GetId() const { return id_; }
virtual const Job& GetJob() const = 0; // 纯虚函数,获取职务信息
protected:
std::string name_;
int age_;
std::string id_;
};
// 派生类:技术员类
class Technician : public Employee {
public:
Technician(const std::string& name, int age, const std::string& id, const Job& job)
: Employee(name, age, id), job_(job) {}
const Job& GetJob() const override { return job_; }
protected:
Job job_;
};
// 派生类:经理类
class Manager : public Employee {
public:
Manager(const std::string& name, int age, const std::string& id, const Job& job, const std::string& department)
: Employee(name, age, id), job_(job), department_(department) {}
const Job& GetJob() const override { return job_; }
const std::string& GetDepartment() const { return department_; }
protected:
Job job_;
std::string department_;
};
// 公司类
class Company {
public:
Company(const std::string& name, const std::string& address) : name_(name), address_(address) {}
const std::string& GetName() const { return name_; }
const std::string& GetAddress() const { return address_; }
// 添加员工
void AddEmployee(Employee* employee) { employees_.push_back(employee); }
// 获取员工数
int GetEmployeeCount() const { return employees_.size(); }
// 获取员工信息
const Employee* GetEmployee(int index) const { return employees_[index]; }
protected:
std::string name_;
std::string address_;
std::vector<Employee*> employees_;
};
```
在此实现中,职务类包含职位标题和薪资,员工类是一个抽象基类,包含姓名、年龄和ID等基本信息,以及一个纯虚函数获取职务信息,经理类和技术员类是员工类的派生类,分别添加了部门和职务信息。公司类包含名称、地址和员工信息等基本信息,以及添加员工、获取员工数和获取员工信息的函数。这个设计可能还有改进的空间,具体取决于应用场景和需求。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)