106 lines
2.0 KiB
C++
106 lines
2.0 KiB
C++
|
#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;
|
|||
|
}
|