首页 > 解决方案 > 在这种情况下,为什么不调用我的虚函数实现?

问题描述

我可以访问实现虚拟方法的接口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;
}

编辑

我刚刚发现, myObjectManager在初始化后立即被销毁。这很奇怪,因为我在构造开始时将它设置为我的权利成员,但它也作为初始化参数MainWindow提供给我,并且也不会死(基于我的ging):GameEventHandlergameEventHandlerqDebug

GOManager_ = std::make_shared<ObjectManager>(playerAges_);
GEHandler_ = std::make_shared<GameEventHandler>(GOManager_);

事件处理程序的主窗口(或两者)应该使对象管理器保持活动状态,但它们不是......这是因为我没有提供赋值运算符,如此所述?

标签: c++c++14virtual-functions

解决方案


确保 OBJECTMANAGER.lock() 返回派生 ObjectManager 类的实例。如果它返回 iObjectManager(),它将调用其基本版本的 getTile(),而不是重载的。


推荐阅读