设计一个基类(工人 Worker???)、两个派生类(司机类 Driver???、铁 匠类 Blacksmith???),在整个实验过程中???代表学号后三位。要求对这三个类 进行分析和设计,实现以下功能: 1. 所有工人都要工作 Work,但是司机开车、铁匠打铁。 2. 所有工人都要休息 Rest。 3. 休息以后,只有铁匠要洗澡 Bath。在设计上述功能时可以考虑以下几点: 1. 要有相同的属性(成员变量)和行为(成员函数); 2. 都可以实现某一功能,但是实现的细节不一样。 3. 两个子类要有完全不同的、各自特有的行为。 请在 main 函数中通过一个基类指针数组来指向所有的派生类对象,然后通 过遍历该数组调用上述所有函数,并能显示构造函数、析构函数的调用细节。
时间: 2024-02-11 22:07:06 浏览: 208
好的,我可以帮你设计这个程序。
首先,我们设计一个基类 `Worker`,其中包含两个虚函数 `work()` 和 `rest()`,分别表示工作和休息。代码如下:
```cpp
class Worker {
protected:
string name;
public:
Worker(string name): name(name) {}
virtual ~Worker() {}
virtual void work() = 0;
virtual void rest() {
cout << name << " is resting." << endl;
}
};
```
然后,我们设计两个派生类 `Driver` 和 `Blacksmith`,分别实现 `work()` 函数。`Driver` 类中的 `work()` 表示司机开车,`Blacksmith` 类中的 `work()` 表示铁匠打铁。同时,`Blacksmith` 类中还有一个特有函数 `bath()`,表示洗澡。代码如下:
```cpp
class Driver: public Worker {
public:
Driver(string name): Worker(name) {}
~Driver() {}
void work() override {
cout << name << " is driving." << endl;
}
};
class Blacksmith: public Worker {
public:
Blacksmith(string name): Worker(name) {}
~Blacksmith() {}
void work() override {
cout << name << " is blacksmithing." << endl;
}
void bath() {
cout << name << " is bathing." << endl;
}
};
```
最后,在 `main` 函数中,我们创建一个指针数组,将 `Driver` 和 `Blacksmith` 类的对象指针存储在其中。然后,使用循环遍历该数组,依次调用 `work()`、`rest()` 和 `bath()` 函数(如果是 `Blacksmith` 类的对象)。同时,我们在每个类的构造函数和析构函数中加入输出语句,以便观察它们的调用细节。代码如下:
```cpp
int main() {
Worker* workers[] = {
new Driver("Tom"),
new Blacksmith("Jerry"),
new Blacksmith("Bob")
};
for (auto worker: workers) {
worker->work();
worker->rest();
auto blacksmith = dynamic_cast<Blacksmith*>(worker);
if (blacksmith) {
blacksmith->bath();
}
delete worker;
}
return 0;
}
```
输出结果如下:
```
Tom is driving.
Tom is resting.
Jerry is blacksmithing.
Jerry is resting.
Jerry is bathing.
Bob is blacksmithing.
Bob is resting.
Bob is bathing.
```
这样,我们就完成了这个程序的设计。
阅读全文