【发布时间】:2020-05-07 19:15:56
【问题描述】:
我的模板有问题 - 虚函数不匹配。
首先,我有一个名为Unit 的父类
和 2 个名为 Hero 和 Monster 的子类。
这 2 个类都有 2 个子类,其中一个类 Hero 的子类是 Crusader。
class Unit {
template <typename target>
virtual void Attack(typename std::vector<target>::iterator targetPtr, std::shared_ptr<AttackSkill> skillPtr) {}
//ERROR (template function can not be virtual)
};
class Hero : public Unit {
template <typename target>
virtual void Attack(typename std::vector<target>::iterator targetPtr, std::shared_ptr<AttackSkill> skillPtr) {}
// ERROR (template function can not be virtual)
};
class Crusader : public Hero {
template <typename target>
void Attack(std::vector<target>::iterator targetPtr, std::shared_ptr<AttackSkill> skillPtr) {}
};
// Unit vector that contains heroes and monsters
std::vector<Unit> unitVector;
Crusader crusader1;
unitVector.at(0).emplace_back[crusader1];
问题是,我想通过将virtual void Attack 函数写入Hero 类和Unit 类来从unitVector[0] 访问Attack 函数
但不幸的是,C++ 不允许这样做。
我应该怎么写这些虚函数?
或者我可以使用一些通用指针(如果有的话)而不是模板?
我想使用来自不同怪物和不同英雄的攻击功能,所以我必须使用模板。如果我尝试编写不同的函数,例如 attackHero 和 attackMonster,其中一个不起作用,因为当我这样做时,我基本上是在尝试获取一些不存在的类向量的迭代器。
请帮帮我!
【问题讨论】:
-
除您描述的以外,在您显示的代码中 Hero 不是从 Unit 派生的。
-
我编辑了它,感谢您的提醒:)
-
那么,如果我理解正确的话,你想在通用单元上调用 Attack(),将通用单元作为目标传递给它,并让子类覆盖 Attack() 的实现?
-
您说
unitVector在您的评论中包含英雄和怪物,但事实并非如此。它只包含Units。阅读object slicing。 -
它实际上有我没有写过的怪物对象,因为我认为它与我的问题无关。即使我有怪物对象我仍然无法使用攻击功能,因为Unit中没有这样的功能。
标签: c++ templates inheritance virtual-functions