我遇到一个棘手的小问题。我认为问题与我的投射方式有关。

因此,我有一个名为combatEntity的基类。具有以下功能

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


然后,我有一个来自combatEntity的类暴民,它覆盖了更新功能:

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

}


然后,我有一个名为monster的类,该类是从mob派生的,并且还覆盖了update函数。

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,但似乎都无法使用。或者,我需要将基类转换为派生类,同时用派生类正确覆盖函数。

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

最佳答案

查看您的层次结构树,确保类与您的想法相关。

这段代码

#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

关于c++ - 将派生类转换为基类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12276689/

10-13 03:31