有一个基类和其五个派生类,如何使用vector二维数组保存其信息并且保存这是哪种派生类
时间: 2024-02-17 15:01:23 浏览: 142
PTA的C++试题,含题目和代码,分类清晰
5星 · 资源好评率100%
可以使用多态和指针来实现。具体的做法是,将基类的指针作为元素类型存储在 `vector` 的二维数组中,每个指针指向一个派生类对象,并且在派生类中定义一个虚函数返回该对象所属的派生类信息。这样,就可以通过基类的指针来访问派生类对象,并且可以通过虚函数获取对象的类型信息。
以下是一个示例程序,其中 `Animal` 是基类,`Cat`、`Dog`、`Bird`、`Fish` 和 `Insect` 是五个派生类,它们都重载了基类的虚函数 `getClassName()` 来返回自身的类型信息。使用 `vector` 的二维数组来存储这些对象,并且使用基类的指针来访问对象和获取类型信息。
```cpp
#include <iostream>
#include <vector>
#include <memory>
class Animal {
public:
virtual std::string getClassName() const {
return "Animal";
}
};
class Cat : public Animal {
public:
std::string getClassName() const override {
return "Cat";
}
};
class Dog : public Animal {
public:
std::string getClassName() const override {
return "Dog";
}
};
class Bird : public Animal {
public:
std::string getClassName() const override {
return "Bird";
}
};
class Fish : public Animal {
public:
std::string getClassName() const override {
return "Fish";
}
};
class Insect : public Animal {
public:
std::string getClassName() const override {
return "Insect";
}
};
int main() {
std::vector<std::vector<std::shared_ptr<Animal>>> animals(2, std::vector<std::shared_ptr<Animal>>(3));
animals[0][0] = std::make_shared<Cat>();
animals[0][1] = std::make_shared<Dog>();
animals[0][2] = std::make_shared<Bird>();
animals[1][0] = std::make_shared<Fish>();
animals[1][1] = std::make_shared<Insect>();
animals[1][2] = std::make_shared<Cat>();
for (int i = 0; i < animals.size(); ++i) {
for (int j = 0; j < animals[i].size(); ++j) {
std::cout << "Animal[" << i << "][" << j << "]: " << animals[i][j]->getClassName() << std::endl;
}
}
return 0;
}
```
该程序定义了一个 `6x2` 的二维数组,每个元素是一个 `std::shared_ptr<Animal>` 类型的指针,指向一个动物对象。使用 `std::make_shared` 函数来创建对象,并且使用 `shared_ptr` 来管理对象的生命周期。在输出二维数组中的元素时,通过基类的指针来访问对象,并且调用虚函数 `getClassName()` 来获取对象的类型信息,输出结果如下:
```
Animal[0][0]: Cat
Animal[0][1]: Dog
Animal[0][2]: Bird
Animal[1][0]: Fish
Animal[1][1]: Insect
Animal[1][2]: Cat
```
阅读全文