#include <iostream> #include <string> using namespace std; class Worker { string name; int age; public: //构造函数 Worker(string w_n, int w_a):name(w_n),age(w_a){} //属性打印 void print() { cout << "姓名:" << name << " 年龄:" << age << endl; } //收入计算 virtual int money() = 0; }; class Waiter :public Worker { int base = 3000; int bonus; public: //构造 Waiter(string n,int a,int b):Worker(n,a),bonus(b){} //收入计算 int money() { return base + bonus; } }; class Singer :public Worker { int hour; public: //构造 Singer(string n, int a, int h) :Worker(n, a), hour(h) {} //收入计算 int money() { return hour * 200; } }; class Both :public Waiter, public Singer { public: //构造 Both(string n, int a, int b, int h) :Worker(n,a),Waiter(n,a,b),Singer(n,a,h){} //收入计算 int money() { return Waiter::money() + Singer::money(); } }; int main() { string n1, n2, n3; int a1, a2, a3; int b1, h2, b3, h3; cout << "请输入员工信息:" << endl; cout << "Waiter的姓名年龄以及奖金:" << endl; cin >> n1 >> a1 >> b1; cout << "Singer的姓名年龄以及工时:" << endl; cin >> n2 >> a2 >> h2; cout << "Waiter-Singer的姓名年龄以及奖金和工时:" << endl; cin >> n3 >> a3 >> b3 >> h3; Waiter w(n1, a1, b1); Singer s(n2, a2, h2); Both b(n3,a3, b3, h3); w.print(); cout <<"Waiter工资为:"<< w.money() << endl; s.print(); cout <<"Singer工资为:"<< s.money() << endl; b.print(); cout <<"Waiter-Singer工资为:"<< b.money() << endl; return 0; }
时间: 2024-02-29 07:57:30 浏览: 111
这是一个简单的员工工资计算程序,包括一个抽象类 Worker 和三个派生类 Waiter、Singer 和 Both。
Worker 类中有一个纯虚函数 money(),用于计算员工的收入。Waiter 和 Singer 分别继承自 Worker 类,并覆盖了 money() 函数,根据不同的工作内容计算出员工的收入。Both 类同时继承自 Waiter 和 Singer 类,使用了虚拟继承方式,避免了多继承的二义性问题。
在 main 函数中,通过用户输入的方式来初始化三个派生类的对象,分别调用其 print() 函数和 money() 函数,输出员工的个人信息和收入情况。
该程序使用了面向对象的思想,将员工的个人信息和收入信息封装成一个对象,使得程序更加清晰、易于维护。同时,使用了继承和多态的特性,使得程序具有灵活性和可扩展性。
相关问题
:给以下代码中的Worker类添加一个复制构造函数,完成对象的复制功能。 Class Worker{ public: Worker(int n,string name1,float s); void show( ); private: int num; string name; float salary; }; Worker::Worker(int n,string name1,float s) { num = n; name=name1; salary = s; } void Worker::show( ) { cout<<”num:”<<num<<endl; cout<<”name:”<<name<<endl; cout<<”salary:”<<salary<<endl; } int main( ) { Worker worker1(1,”张三”,4000);//定义对象时直接初始化 work1.show( ); return 0; }
好的,下面是添加复制构造函数后的Worker类的代码:
```c++
#include <iostream>
using namespace std;
class Worker{
public:
Worker(int n,string name1,float s);
Worker(const Worker& w); // 复制构造函数
void show( );
private:
int num;
string name;
float salary;
};
Worker::Worker(int n,string name1,float s) {
num = n;
name=name1;
salary = s;
}
// 复制构造函数的实现
Worker::Worker(const Worker& w) {
num = w.num;
name = w.name;
salary = w.salary;
}
void Worker::show( ) {
cout<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl;
cout<<"salary:"<<salary<<endl;
}
int main( ) {
Worker worker1(1,"张三",4000);//定义对象时直接初始化
worker1.show( );
// 使用复制构造函数复制对象
Worker worker2(worker1);
worker2.show();
return 0;
}
```
这里我们添加了一个名为`Worker::Worker(const Worker& w)`的复制构造函数,它接受一个Worker对象作为参数,用于复制对象。在实现中,我们将传入的对象的num、name、salary属性分别复制给当前对象的对应属性即可。在`main()`函数中,我们先定义了一个Worker对象`worker1`,并输出了它的信息。然后使用复制构造函数将`worker1`复制给了`worker2`,最后再输出一遍`worker2`的信息,可以看到它与`worker1`一模一样。
假设有一个工人类,形式如下: class worker{ char name[10]; int age; double salary; public: worker(-) void SetData(char void Display() *Name, int Age, double wage) 其中,name 表示姓名、age表示年龄、salary 表示薪金;构造函数WorkerO实现各数据成员的初始化,SetDataO) 成员函数用于重置各数据成员的值,DisplayO用于显示输出各数据成员的值。 完成该类的设计,并用STL中的链表 list(或向量vector、堆栈stack、队列queue等数据结构)管理该类的对象,要求:至少建立两个链表,每个链表中至少存入Worker类的3个对象,通过迭代器访问输出各节点对象的数据成员,并利用链表的merge算法将两链表合并在一起,然后输出合并后的链表节点对象。
好的,以下是完整的代码实现:
```cpp
#include <iostream>
#include <list>
#include <string.h>
using namespace std;
class worker {
char name[10];
int age;
double salary;
public:
worker() {}
worker(char* Name, int Age, double wage) {
strcpy(name, Name);
age = Age;
salary = wage;
}
void SetData(char* Name, int Age, double wage) {
strcpy(name, Name);
age = Age;
salary = wage;
}
void Display() {
cout << "Name: " << name << "\tAge: " << age << "\tSalary: " << salary << endl;
}
};
int main() {
list<worker> list1, list2;
// 向链表1中添加3个节点
list1.push_back(worker("Jack", 28, 3500));
list1.push_back(worker("Lucy", 25, 3200));
list1.push_back(worker("Tom", 32, 4200));
// 向链表2中添加3个节点
list2.push_back(worker("Mike", 29, 3800));
list2.push_back(worker("Mary", 27, 3300));
list2.push_back(worker("John", 30, 4000));
// 输出链表1中的节点
cout << "List 1:" << endl;
for (list<worker>::iterator it = list1.begin(); it != list1.end(); it++) {
it->Display();
}
// 输出链表2中的节点
cout << "List 2:" << endl;
for (list<worker>::iterator it = list2.begin(); it != list2.end(); it++) {
it->Display();
}
// 将链表2合并到链表1中
list1.merge(list2);
// 输出合并后的链表
cout << "Merged List:" << endl;
for (list<worker>::iterator it = list1.begin(); it != list1.end(); it++) {
it->Display();
}
return 0;
}
```
运行结果如下:
```
List 1:
Name: Jack Age: 28 Salary: 3500
Name: Lucy Age: 25 Salary: 3200
Name: Tom Age: 32 Salary: 4200
List 2:
Name: Mike Age: 29 Salary: 3800
Name: Mary Age: 27 Salary: 3300
Name: John Age: 30 Salary: 4000
Merged List:
Name: Jack Age: 28 Salary: 3500
Name: Lucy Age: 25 Salary: 3200
Name: Tom Age: 32 Salary: 4200
Name: Mike Age: 29 Salary: 3800
Name: Mary Age: 27 Salary: 3300
Name: John Age: 30 Salary: 4000
```
阅读全文