多态需要基类和子类的类型转换时,可以使用dynamic_cast来完成。
例子如下:
class Entity
{
virtual void PrintName(){}
};
class Player : public Entity
{
};
class Enemy : public Entity
{
};
int main(){
Entity* player = new Player();
Entity* enemy = new Enemy();
Player* p0 = dynamic_cast<Player*>(player);
Player* p1 = dynamic_cast<Player*>(enemy);
if (p0)
{
std::cout << "p0 is player" << std::endl;
}
if (p1)
{
std::cout << "p1 is player" << std::endl;
}
}
可以看到,Player和Enemy都是Entity的子类,同样是Entity类型的基类指针,当enemy对象要转换成Player类型时会产生问题,dynamic_cast的作用是防止这种事情发生。
如果不能转换成功的话,dynamic_cast将返回空指针,因此可以用if来完成转换判断并对转换完的指针进行操作。