#include <iostream>
#include <typeinfo>

class Animal
{
public:
    virtual ~Animal() {}
};

class Cat : public Animal
{
public:
    void meow()
    {
        std::cout << "Meow!" << std::endl;
    }
};

class Dog : public Animal
{
public:
    void bark()
    {
        std::cout << "Woof!" << std::endl;
    }
};

int main()
{
    // 任务1：将Animal类型指针转换为Cat类型指针
    Animal *animal1 = new Cat();
    try
    {
        Cat *cat = dynamic_cast<Cat *>(animal1);
        if (cat)
        {
            cat->meow();
        }
        else
        {
            throw 1;
        }
    }
    catch (int e)
    {
        std::cout << "转换失败：无法将Animal类型转换为Cat类型。" << std::endl;
    }

    // 任务2：将Animal类型指针转换为Dog类型指针
    Animal *animal2 = new Dog();
    try
    {
        Dog *dog = dynamic_cast<Dog *>(animal2);
        if (dog)
        {
            dog->bark();
        }
        else
        {
            throw 2;
        }
    }
    catch (int e)
    {
        std::cout << "转换失败：无法将Animal类型转换为Dog类型。" << std::endl;
    }

    // 任务3：将Cat类型指针转换为Animal类型指针
    Cat *cat2 = new Cat();
    try
    {
        Animal *animal3 = dynamic_cast<Animal *>(cat2);
        if (animal3)
        {
            std::cout << "转换成功：Cat类型成功转换为Animal类型。" << std::endl;
        }
    }
    catch (const std::bad_cast &e)
    {
        std::cout << "转换失败：" << e.what() << std::endl;
    }

    // 任务4：将Dog类型指针转换为Animal类型指针
    Dog *dog2 = new Dog();
    try
    {
        Animal *animal4 = dynamic_cast<Animal *>(dog2);
        if (animal4)
        {
            std::cout << "转换成功：Dog类型成功转换为Animal类型。" << std::endl;
        }
    }
    catch (const std::bad_cast &e)
    {
        std::cout << "转换失败：" << e.what() << std::endl;
    }

    // 释放内存
    delete animal1;
    delete animal2;
    delete cat2;
    delete dog2;

    return 0;
}
