定义一个类Animal,该类可以存放动物名字,并且有成员函数Identify()用于显示动物名字(输出: I am an animal:动物名字)

根据以下要求,完成编程。
1)定义一个类Animal,该类可以存放动物名字,并且有成员函数Identify()用于显示动物名字(输出: I am an animal:动物名字)
2)定义两个类Cat、Dog,都继承自Animal,并且都重载了Identify(),显示动物种类和名字(分别输出:I am a cat:动物名字; I am a dog:动物名字)
3)定义类Tiger,继承自类Cat,重载Identify(),显示输出:I am a tiger: 动物名字
4)定义一个动物园类Zoo,根据以下的提示编写动物类。注意指针指向虚函数的用法。

class Zoo
{
public:
    Zoo(int max);                    //max为动物园最多能圈养动物数
    ~Zoo(){ delete residents; } 
    void Accept(Animal *d);         //接受动物
    void ListAnimal();              //显示动物园所有的动物
private:
    int max_animals;               //动物园能圈养的动物数
    int num_animals;               //动物园动物园当前圈养的动物数
    Animal **residents;            //指向动物园圈养的动物对象的指针数组
};

编程要求:创建三个对象Cat类对象 cat("汤姆猫")、Dog类对象dog("汪汪狗")、Tiger类对象tiger("贝乐虎"),先显示各自类的Identify()。再创建Zoo类对象shanghai, 将三只动物依次圈养到shanghai动物园,并依次输出当前圈养的动物信息。

试试。


#include <iostream>
using namespace std;

class Animal
{
public:
    Animal(std::string name_) {
        name = name_;
    };
    virtual ~Animal() {
        cout << "delete animal:" << name.c_str() << endl;
    }

    virtual void Identify() {
        cout << "I am an animal:" << name.c_str() << endl;
    }

protected:
    std::string name;
};

class Cat : public Animal
{
public:
    Cat(std::string name_)
        : Animal(name_) {
    }

    virtual ~Cat() {
        cout << "delete cat:" << name.c_str() << endl;
    }

    virtual void Identify() {
        cout << "I am an cat:" << name.c_str() << endl;
    }

};

class Dog : public Animal
{
public:
    Dog(std::string name_)
        : Animal(name_) {
    }

    virtual ~Dog() {
        cout << "delete dog:" << name.c_str() << endl;
    }

    virtual void Identify() {
        cout << "I am an dog:" << name.c_str() << endl;
    }

};

class Tiger : public Cat
{
public:
    Tiger(std::string name_)
        : Cat(name_) {
    }

    virtual ~Tiger() {
        cout << "delete tiger:" << name.c_str() << endl;
    }

    virtual void Identify() {
        cout << "I am an tiger:" << name.c_str() << endl;
    }
};

class Zoo
{
public:
    Zoo(int max);                    //max为动物园最多能圈养动物数
    ~Zoo() { delete residents; }
    void Accept(Animal *d);         //接受动物
    void ListAnimal();              //显示动物园所有的动物
private:
    int max_animals;               //动物园能圈养的动物数
    int num_animals;               //动物园动物园当前圈养的动物数
    Animal **residents;            //指向动物园圈养的动物对象的指针数组
};

Zoo::Zoo(int max)
{
    num_animals = 0;
    max_animals = max;
    residents = new Animal*[max_animals];
}

void Zoo::Accept(Animal *d)
{
    if (num_animals >= max_animals) {
        cout << "动物园已满,无法继续圈养额外的动物!" << endl;
        return;
    }

    residents[num_animals] = d;
    num_animals++;
}

void Zoo::ListAnimal()
{
    for (int i = 0; i < num_animals; i++) {
        Animal* d = residents[i];
        d->Identify();
    }
}

int main()
{
    Animal* cat = new Cat("汤姆猫");
    Animal* dog = new Dog("汪汪狗");
    Animal* tiger = new Tiger("贝乐虎");

    Zoo* shanghai = new Zoo(3);
    
    shanghai->Accept(cat);
    shanghai->Accept(dog);
    shanghai->Accept(tiger);
    
    shanghai->ListAnimal();
    
    delete shanghai;
    delete cat;
    delete dog;
    delete tiger;

    std::cout << "Hello Zoo!\n";
}