c++ - 在这种情况下,为什么不调用我的虚函数实现?
问题描述
我可以访问实现虚拟方法的接口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):GameEventHandler
gameEventHandler
qDebug
GOManager_ = std::make_shared<ObjectManager>(playerAges_);
GEHandler_ = std::make_shared<GameEventHandler>(GOManager_);
事件处理程序的主窗口(或两者)应该使对象管理器保持活动状态,但它们不是......这是因为我没有提供赋值运算符,如此处所述?
解决方案
确保 OBJECTMANAGER.lock() 返回派生 ObjectManager 类的实例。如果它返回 iObjectManager(),它将调用其基本版本的 getTile(),而不是重载的。
推荐阅读
- bash - 如何删除文件末尾的这个特殊字符
- javascript - Node Js NPM PDFkit和Voilab pdf表格,生成表格后pdfkit段落错误
- shopify - Shopoify 的 Polaris 是用于样式主题还是仅用于创建自定义/公共应用程序?
- javascript - 在 JavaScript 中使用带有变量的方法
- sql - 在 SQL 中的 FOR JSON 输出中防止双重转义 JSON
- python - Matplotlib.plot() 不会正确渲染绘图。改为制作某种网络
- javascript - 将文档添加到 Firestore 中不存在的子集合
- http - 使用 curl 进行 nutch RESTapi 调用时出错
- python - 如何在不使用 json 库或在字典或列表中没有任何其他库的情况下读取 json 文件?
- vbscript - Global.asa 上的 Session_OnEnd 事件,并发问题