我遇到了一个棘手的小问题。我认为这个问题与我铸造东西的方式有关。
所以我有一个名为combatEntity
的基类。它具有以下功能
class combatEntity {
public:
virtual void update();
};
然后我有一个派生自combatEntity
的类mob,它会覆盖更新函数:
class mob : public combatEntity {
public:
virtual void update();
}
然后我有一个名为monster
的类,它来自mob
并且还会覆盖更新函数。
class monster: public mob {
public:
virtual void update();
}
我有一个名为i
的combatEntity指针:
combatEntity* i;
然后我有:
//returns a mob* pointer (needs explicit cast)
monster* newMonster = getMob();
i = newMonster;
getMob()
功能:
mob* getMob() {
mob* newMob = new mob();
//set some data in newMob
return newMob;
}
当我致电i->update()
时,它会调用mob::update()
,因为newMonster
设置为“new mob();”,因为getMob()
会返回新的移动指针。当我拨打i->update()
时,我需要它来拨打monster::update()
,但是使用断点,我看到它正在呼叫mob::update()
而不是monster::update()
。
所以我需要创建一个新的monster
对象,但仍然有它的基类数据填充了从getMob()
返回的对象,但是正确地覆盖了这些函数。我也尝试过dynamic_cast,static_cast和reinterpret_cast,但似乎都没有。或者我需要将我的基类强制转换为派生类,同时使用派生类正确覆盖函数。
希望这样做。任何建议将不胜感激。
答案 0 :(得分:2)
查看您的层次结构树,确保这些类与您的思考方式相关。
此代码
#include <iostream>
struct combatEntity
{
virtual void Update() { std::cout << "Combat Entity\n"; };
};
struct mob : combatEntity
{
virtual void Update() { std::cout << "Mob\n"; };
};
struct monster : mob
{
virtual void Update() { std::cout << "Monster\n"; };
};
int main(int argc, char **argv)
{
combatEntity *ce = new monster;
ce->Update();
delete ce;
return 0;
}
创建此输出:
Monster
答案 1 :(得分:0)
你的行
monster* newMonster = getMob();
不应该编译。我得到了
error: invalid conversion from ‘mob*’ to ‘monster*’ [-fpermissive]
(您的行i = monster;
大概应该是i = newMonster;
)。这就解释了这一切,我认为(参见Luchian的评论)。
答案 2 :(得分:0)
好吧,既然你正在使用虚拟,那么无论你声明指针是什么,“update”总是会调用正确的函数。这就是“虚拟”的运作方式。
如果你希望你的指针确定被调用的内容,而不是对象本身,那么将这些东西设置为非虚拟的。在这种情况下,指针类型将确定调用哪个“更新”。
如果你想要两者,你仍然可以调用像monster :: update()这样的东西,而不仅仅是更新。但是,除非您从派生类的更新函数(调用超类实现)中执行此操作,否则尝试通过继承层次结构可能是设计错误的标志。