假设有一个基类Animal和两个派生类Dog和Cat。请定义一个类Zoo,该类包含一个由Animal指针构成的数组,能够存储多个Animal及其派生类的对象。请定义Zoo类的构造函数、析构函数和addAnimal()函数,能够向数组中添加Animal及其派生类的对象,并定义一个printAnimals()函数,能够打印数组中所有Animal及其派生类的信息。请编写C++代码,测试该类及其成员函数。
时间: 2024-02-09 08:07:59 浏览: 55
C++基类指针和派生类指针之间的转换方法讲解
好的,我可以帮你解决这个问题。以下是代码实现:
```c++
#include <iostream>
using namespace std;
class Animal {
public:
Animal(string name): m_name(name) {}
virtual void printInfo() {
cout << "I am an animal, my name is " << m_name << endl;
}
protected:
string m_name;
};
class Dog : public Animal {
public:
Dog(string name) : Animal(name) {}
void printInfo() {
cout << "I am a dog, my name is " << m_name << endl;
}
};
class Cat : public Animal {
public:
Cat(string name) : Animal(name) {}
void printInfo() {
cout << "I am a cat, my name is " << m_name << endl;
}
};
class Zoo {
public:
Zoo(int size) : m_size(size), m_count(0) {
m_animals = new Animal*[size];
}
~Zoo() {
for (int i = 0; i < m_count; i++) {
delete m_animals[i];
}
delete [] m_animals;
}
void addAnimal(Animal* animal) {
if (m_count < m_size) {
m_animals[m_count++] = animal;
}
}
void printAnimals() {
for (int i = 0; i < m_count; i++) {
m_animals[i]->printInfo();
}
}
private:
Animal** m_animals;
int m_size;
int m_count;
};
int main() {
Zoo zoo(3);
Animal* animal1 = new Animal("Tom");
Animal* animal2 = new Dog("Bob");
Animal* animal3 = new Cat("Lucy");
zoo.addAnimal(animal1);
zoo.addAnimal(animal2);
zoo.addAnimal(animal3);
zoo.printAnimals();
return 0;
}
```
在这个例子中,我们定义了三个类:Animal,Dog和Cat。Animal是一个基类,Dog和Cat是Animal的派生类。然后我们定义了一个Zoo类,包含一个由Animal指针构成的数组,能够存储多个Animal及其派生类的对象。
Zoo类的构造函数创建了一个动态分配的Animal指针数组,大小为size。addAnimal()函数可以向数组中添加Animal及其派生类的对象。printAnimals()函数可以打印数组中所有Animal及其派生类的信息。
在main()函数中,我们创建了一个Zoo对象,并向其中添加了三个Animal及其派生类的对象。然后调用printAnimals()函数打印它们的信息。
注意,在Zoo的析构函数中,我们需要删除动态分配的Animal对象,以避免内存泄漏。
阅读全文