dynamic_cast<type>() 动态类型转换,用于类层次间的向上和向下转换,但只适用于含有虚函数的类之间转换
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
using namespace std;
class Animal
{
public:
Animal(string str):name(str){}
void Eat() //所有动物都会吃
{
cout << name << "正在吃" << endl;
}
virtual void Speak() = 0; //所有动物都会叫,但声音不一样,所以设为虚函数
virtual ~Animal(){}
protected:
string name;
};
class Dog :public Animal
{
public:
Dog(string str):Animal(str){} //用基类的构造函数初始化name
void Speak() //子类的也是虚函数
{
cout << name << "汪汪叫" << endl;
}
void Run()
{
cout << name << "正在跑" << endl;
}
};
class Bird :public Animal
{
public:
Bird(string str):Animal(str){} //用基类的构造函数初始化name
void Speak() //子类的也是虚函数
{
cout << name << "喳喳叫" << endl;
}
void Fly()
{
cout << name << "正在飞" << endl;
}
};
int main()
{
vector<Animal*> allAnimals(2); //基类指针数组
allAnimals[0] = new Dog("小狗"); //基类指针指向派生类对象
allAnimals[0]->Eat();
allAnimals[0]->Speak();
Dog* pd = dynamic_cast<Dog*>(allAnimals[0]); //基类指针不能调用子类的Run()函数,所以将基类指针类型转换为派生类指针类型
pd->Run();
cout << "----------" << endl;
allAnimals[1] = new Bird("小鸟");
allAnimals[1]->Eat();
allAnimals[1]->Speak();
Bird* pb = dynamic_cast<Bird*>(allAnimals[1]); //基类指针不能调用子类的Fly()函数,所以将基类指针类型转换为派生类指针类型
pb->Fly();
}