从基到派生的动态转换 class 以访问方法

Dynamic cast from base to derived class in order to access a method

我可以访问一个基础 class PlayerBase,我从中导出了 class Player。还有另一个 class、GameEventHandler,负责实际将 "resources" 委托给每个玩家,其方法为 GameEventhandler::ModifyResource:

bool GameEventHandler::modifyResource(std::shared_ptr<Course::PlayerBase> player,
                                      Course::BasicResource resource,
                                      int amount)
{

}

但是,如您所见,此方法的实现由我决定。

问题如下:只有派生的class Player有一个方法Player::increaseResource,可以增加它的一个资源。但是,方法 modifyResource 将指向 PlayerBase 对象的共享指针作为参数。这意味着,为了访问方法 Player::increaseResource,我必须将 Playerbase 类型指针转换为 Player 类型指针,或者做一些其他的技巧。

如何处理这种情况?我尝试过

std::shared_ptr<Player> ownPlayerPtr
    = dynamic_cast<std::shared_ptr<Player>>(player);

但这给出了错误 std::shared_ptr<Player> is nmot a reference to a pointer。将其更改为

std::shared_ptr<Player> ownPlayerPtr
    = dynamic_cast<std::shared_ptr<Player>&>(player);

给出错误信息 'std::shared_ptr<Course::PlayerBase>' is not polymorphic = dynamic_cast<std::shared_ptr<Player>&>(player);

关于为什么会发生这种情况以及我需要做什么来解决这个问题有什么想法吗?

可能与 this 重复。

尝试使用dynamic_pointer_cast:

std::shared_ptr<Course::Player> p = std::dynamic_pointer_cast<Course::Player>(player);

您可以改用共享指针的动态转换。 如果共享指针不为空,并且这样的转换不会 return 空指针,则 returned 对象共享共享指针资源的所有权,使用次数增加 1。 否则,returned 对象是空的 shared_ptr。 IE std::shared_ptr ownPlayerPtr = std::dynamic_pointer_cast(玩家).