为什么在这种情况下我的虚拟函数的实现没有被调用?

问题描述 投票:-2回答:1

我可以访问实现虚拟方法iObjectManager::getTile(const Course::ObjectId &id) = 0的接口。我在继承的class ObjectManager:public Course::iObjectManager中重新实现了上述方法,如下所示:

std::shared_ptr<Course::TileBase> getTile(const Course::ObjectId &id) override;

std::shared_ptr<Course::TileBase> ObjectManager::getTile(const Course::ObjectId &id)
{
  qDebug() << "Looking for tile based on ID...\n";
  for (unsigned i = 0; i < getMapSize(); i++) {
    for (unsigned j = 0; j < getMapSize(); j++) {
      std::shared_ptr<BoardPiece> tile = getGameMap().at(i).at(j);
      if (tile->ID == id) {
        qDebug() << "Tile found.\n";
        return std::move(tile);
      }
    }
  }
  qDebug() << "No tile with given index...\n";
  return nullptr;
}

问题出现了,当课程附带代码调用getTile:什么也没发生。不会拨打qDebug,并且不会打印任何内容。即使我已经正确实现了该功能,为什么仍无法调用该函数(或者缺少实现的那个)?

该函数的名称如下:

tile = lockObjectManager()->getTile(ID);

其中lockObjectManager定义为

std::shared_ptr<iObjectManager> GameObject::lockObjectManager() const
{
    std::shared_ptr<iObjectManager> handler = OBJECTMANAGER.lock();
    Q_ASSERT(handler);
    return handler;
}
c++ c++14 virtual-functions
1个回答
0
投票
确保OBJECTMANAGER.lock()返回派生的ObjectManager类的实例。如果返回iObjectManager(),它将调用其基本版本的getTile(),而不是重载的版本。
© www.soinside.com 2019 - 2024. All rights reserved.