0

我遇到了一个棘手的小问题。我相信这个问题与我铸造事物的方式有关。

所以我有一个名为combatEntity. 它具有以下功能

class combatEntity {
public:
    virtual void update();
};

然后我有一个类 mob,它派生自combatEntity,覆盖更新函数:

class mob : public combatEntity {
public:
    virtual void update();

}

然后我有一个名为 的类monster,它派生自mob并且还覆盖了更新函数。

class monster: public mob {
public:
    virtual void update();
}

我有一个名为战斗实体的指针i

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()返回一个新的 mob 指针。当我调用时i->update(),我需要它调用monster::update(),但是使用断点,我看到它正在调用mob::update()而不是调用monster::update()

所以我需要创建一个新monster对象,但仍然有它的基类数据填充从返回的对象getMob(),但函数被正确覆盖。我也尝试过 dynamic_cast、static_cast 和 reinterpret_cast,但似乎都没有。或者我需要将我的基类转换为派生类,同时用派生类正确覆盖函数。

希望这是有道理的。任何意见,将不胜感激。

4

3 回答 3

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

来源:http: //ideone.com/k6LAB

于 2012-09-05T07:59:59.950 回答
0

你的线

monster* newMonster = getMob();

不应该编译。我明白了

error: invalid conversion from ‘mob*’ to ‘monster*’ [-fpermissive]

(您的行也i = monster;应该是i = newMonster;)。我认为这解释了一切(另见 Luchian 的评论)。

于 2012-09-05T07:49:30.810 回答
0

好吧,由于您使用的是虚拟,因此“更新”将始终调用正确的函数,无论您声明指针是什么。这就是“虚拟”的工作方式。

如果您希望您的指针确定被调用的内容,而不是对象本身,请使这些东西成为非虚拟的。在这种情况下,指针类型将确定调用哪个“更新”。

如果你想要两者,你仍然可以调用诸如 monster::update() 之类的东西,而不仅仅是更新。但是,除非您是从派生类的更新函数中执行此操作(以调用超类实现),否则试图越过继承层次结构可能是设计不佳的标志。

于 2012-09-05T07:53:31.717 回答