将派生类转换为基类

时间:2012-09-05 07:40:24

标签: c++ polymorphism override

我遇到了一个棘手的小问题。我认为这个问题与我铸造东西的方式有关。

所以我有一个名为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,但似乎都没有。或者我需要将我的基类强制转换为派生类,同时使用派生类正确覆盖函数。

希望这样做。任何建议将不胜感激。

3 个答案:

答案 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

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

答案 1 :(得分:0)

你的行

monster* newMonster = getMob();

不应该编译。我得到了

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

(您的行i = monster;大概应该是i = newMonster;)。这就解释了这一切,我认为(参见Luchian的评论)。

答案 2 :(得分:0)

好吧,既然你正在使用虚拟,那么无论你声明指针是什么,“update”总是会调用正确的函数。这就是“虚拟”的运作方式。

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

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