有一个基类warrior和其五个派生类lion wolf ninja icrman dragon,每次都会产生其中的一个武士,并且每次产生的时候都会有位置和阵营,如何保存武士的位置和阵营信息并且能够保存位置和阵营信息以及武士的数据成员和函数成员c++
时间: 2024-02-17 18:00:00 浏览: 14
可以使用一个容器来保存武士的信息,例如使用一个vector容器,每次产生一个武士时,将其信息存储在vector中。可以定义一个结构体来保存武士的信息,包括武士类型、位置和阵营等信息,然后将该结构体作为vector的元素进行存储。
同时,为了能够保存武士的数据成员和函数成员,需要定义一个虚基类Warrior,然后让每个派生类继承该基类,并实现自己的数据成员和函数成员。在存储武士信息时,可以将其转换为Warrior类型的指针来存储,然后通过动态绑定来调用每个武士的数据成员和函数成员。
例如,定义如下虚基类:
```
class Warrior {
public:
virtual void showInfo() = 0; // 显示武士信息的虚函数
};
struct WarriorInfo {
Warrior* warrior; // 指向武士的指针
int position; // 武士位置
string camp; // 武士阵营
};
```
然后可以定义每个派生类,例如:
```
class Lion : public Warrior {
private:
int loyalty; // lion特有的数据成员
public:
Lion() {
loyalty = 10;
}
void showInfo() {
cout << "Lion, loyalty: " << loyalty << endl;
}
};
class Wolf : public Warrior {
private:
int morale; // wolf特有的数据成员
public:
Wolf() {
morale = 5;
}
void showInfo() {
cout << "Wolf, morale: " << morale << endl;
}
};
// ...
```
然后在产生一个武士时,将其信息存储在vector中:
```
vector<WarriorInfo> warriors;
// 产生一个lion武士,位置为3,阵营为red
Warrior* lion = new Lion;
WarriorInfo lionInfo = {lion, 3, "red"};
warriors.push_back(lionInfo);
// 产生一个wolf武士,位置为5,阵营为blue
Warrior* wolf = new Wolf;
WarriorInfo wolfInfo = {wolf, 5, "blue"};
warriors.push_back(wolfInfo);
// 产生一个ninja武士,位置为8,阵营为red
Warrior* ninja = new Ninja;
WarriorInfo ninjaInfo = {ninja, 8, "red"};
warriors.push_back(ninjaInfo);
// ...
```
可以通过遍历vector来查看每个武士的信息,例如:
```
for (int i = 0; i < warriors.size(); i++) {
cout << "武士位置:" << warriors[i].position << endl;
cout << "武士阵营:" << warriors[i].camp << endl;
warriors[i].warrior->showInfo(); // 调用武士的showInfo()函数
}
```
需要注意的是,在程序结束时需要释放每个武士的内存,避免内存泄漏。可以通过遍历vector来释放每个武士的内存,例如:
```
for (int i = 0; i < warriors.size(); i++) {
delete warriors[i].warrior;
}
```