使用父类时访问子函数

时间:2013-04-25 10:26:51

标签: c++ qt oop

我正在为大学课程和我做任务,我的伴侣有问题。我们正在制作的节目是一款游戏。

我们有几个类,它们都从基类继承,名为Creature。这些都是玩家需要处理的敌人,他们都运行自己的AI。有4种不同类型的子类,都在命名空间Creature(包括parent,Creature)中,其中一个类具有只需要的特殊功能。这个班叫做Bunny。

现在,我的工作是根据需要调用AI功能。问题是,当我要求游戏板告诉我生化的内容时,我并不总是知道我正在呼唤的课程。

在游戏板方块中,所有敌人都像指针一样保存:

    struct Square
    {   
        // Pointers to Morso class, where the enemy is saved
        Creature::Creature* creature;
        //Undeeded stuff removed

    };

现在,在我们需要访问特殊功能之前,这一切都很好。如果满足某些条件,Pupu将成倍增加。因此,在Pupu中我需要调用的函数很少,以确保它能够正确执行它。

然而,问题出现了。

我打电话给我们的委员会班给我一个在我给它的坐标中的生物。

void GameEngine::GameEngine::runAI()
{
    Creature::Creature* creature= NULL;

    for(unsigned int y = 0; y < dimY; y++)
    {
        for(unsigned int x = 0; x < dimX; x++)
        {
            Coordinate target;

            target.setX(x);
            target.setY(y);

            creature= board_->returnCreature(target);

            //If there is a creature in the target, run its AI
            if(creature!= NULL)
            {

                //If it is, check special procedures
                if(creature->returnType() == "bunny")
                {
                    bunnyReproduce(creature);
                }

                creature->ai();
            }

        }//for x

    }//for y
}

现在,:

void GameEngine::GameEngine::bunnyReproduce(Ccreature::Creature* creature)
{

//Checks that it really is a bunny
if( creature->returnType() != "bunny"){ return; }

//Check is there another bunny near
creature->checkForMate();


}

问题是,此时,生物无法调用checkForMate,它是Bunny的公共成员,而不是生物。我们需要在Creature中创建虚函数吗?

我尝试将checkForMate制作成Creature :: Bunny,但是因为我试图给它的原始值是Creature类,所以我不能这样做。我们是否需要在Creature类中创建一个空的虚函数,然后将其覆盖为Bunnyclass?

我正在使用QT 5.0.2运行Qt Creator 2.7.0。

2 个答案:

答案 0 :(得分:3)

您应该将virtual函数reproduce添加到Creature课程,并在Bunny或您之后添加到游戏中的任何其他生物中实施。这样任何生物都会以自己的方式复制自己。在这种情况下,您甚至不需要检查生物类型。因为如果你有一些不可复制的生物,你可能只是将reproduce实现为无效的空方法。

答案 1 :(得分:0)

理想情况下,您的引擎不需要关心它正在使用什么类型的生物。

如果您希望兔子在每个ai()步骤中重现,为什么不在兔子的ai()中进行复制? 毕竟,兔子有责任决定何时复制,而不是一些全能的外部引擎?

void Creature::Bunny::ai()
{
    if (niceMateNearby())
        reproduce();
    else
        eatCarrotsAndJumpAround();
}