C ++ - 将{superclass}的变量转换为{subclass}

时间:2014-04-10 14:18:51

标签: c++ inheritance casting

作为一个学习C ++后的练习程序,我正在开发一个基于文本的游戏。我使用面向对象的编程风格来处理世界/他们的对象。以下是有关其定义的必要信息:

class Object
{
    private:
        unsigned int id;
    public:
        unsigned int getID() const { return id; }
};
class TakeableObject: public Object
{
   ...
};
class EdibleObject: public TakeableObject
{
    private:
        float healthEffect;
        float staminaEffect;
    public:
        float getHealthEffect() const { return healthEffect; }
        float getStaminaEffect() const { return staminaEffect; }
};
class Player
{
    private:
        float health;
        float stamina;
        TakeableObject inventory[256];
    public:
        eat(const EdibleObject* o)
        {
            health += o->getHealthEffect();
            stamina += o->getStaminaEffect();
        }
        eat(int id)
        {
            if (inventory[id] == NULL)
                throw "No item with that ID!";
            eat((EdibleObject) inventory[id]);
            inventory[id] = NULL;
        }
};

所以我的问题是 - 在Player::eat(int)中,有没有办法可以确保Object Player::inventory[id]EdibleObject(可能通过异常处理?)< / p>

1 个答案:

答案 0 :(得分:0)

用户动态强制转换以在运行时检查对象类型。

或者您可以在父级中使用具有默认定义的虚函数,并可以根据您在派生类中的要求更新它。

而不是eat((EdibleObject) inventory[id]);使用以下

EdibleObject *temp = dynamic_cast<EdibleObject *>( &inventory[id] );
if(temp) { eat(*temp); }
else { /* Handling */ }

您的代码遇到Object splicing,请务必先删除它。