#include <iostream>
#include <cstring>
#include <cstdlib>

using namespace std;

class Animal
{
protected:
    string name;
    float price;

public:
    Animal(const string &name, float price)
    {
        this->name = name;
        this->price = price;
    }
    virtual void buy(); // 类内声明的虚函数
};

// 类外实现类中的虚函数
void Animal::buy()
{
    cout << "小宠物 " << name << " 卖了 " << price << endl;
}

class Dog : public Animal
{
private:
    int age;

public:
    Dog(string name, float price, int age) : Animal(name, price), age(age)
    {
    }
    virtual void buy() // 重写父类的虚函数
    {
        cout << age << " 岁小狗 " << name << " 卖了 " << price << endl;
    }
    void eat() // 扩展的新功能
    {
        cout << name << " 喝酒" << endl;
    }
};

class Cat : public Animal
{
private:
    int age;

public:
    Cat(string name, float price) : Animal(name, price)
    {
    }
    virtual void buy() // 重写父类的虚函数
    {
        cout << "小猫 " << name << " 卖了 " << price << endl;
    }
    void eat() // 扩展的新功能
    {
        cout << name << " 吃鱼" << endl;
    }
};

class AnimalShop
{
public:
    // 多态应用之一
    void buy(Animal *animal)
    {
        cout << "-----动物之家正在出售小宠物-----" << endl;
        animal->buy();
        cout << "-----出售结束-----" << endl;

        delete animal; // 释放堆区空间
    }
};

int main()
{
    AnimalShop shop;
    Dog dog("旺财", 1000, 3);
    // 多态的应用
    shop.buy(&dog);
    shop.buy(new Cat("小花", 500));
    return 0;
}
