在C ++中,如何使用一个类成员来保存从基类派生的任何对象?

时间:2013-12-25 12:28:23

标签: c++ pointers polymorphism

提前感谢您阅读和/或回复此问题。我对编程很陌生。

假设我有一个使用ABC类型武器对象作为成员的Player类。

class Player
{
private:
Weapon * mainHand;  // I think this is what I want?
};

但是我想分配任何派生类类型,例如俱乐部或匕首。如何为其分配新对象?正如您可能已经猜到的那样,我希望用户能够做出运行时决定“装备”多个可用对象中的任何一个。

无论如何,我已经尝试了大约两周的时间通过阅读论坛上的内容来解决这个问题而且我只是失败了。谢谢你帮助我。

4 个答案:

答案 0 :(得分:1)

您可以将mainHand变量指定给指向Weapon类派生类型的任何对象的指针。就像那样(只是例子,而不是设计建议):

void equipClub()
{
    Club* someShinyClub = new Club();
    mainHand = someShinyClub;
}

甚至直接:

mainHand = new Club();

之后,可以从该指针访问Weapon声明的所有方法。但是对于派生类中的特定操作,您需要进行强制转换。

答案 1 :(得分:0)

如果我理解正确,您希望能够在运行时决定播放器的武器选择。

您可能已经意识到需要来自Weapon的派生类。

你只需要做以下事情;虽然我建议你找到一种更有效的方法。 (DaggerSword类)

if(player.weaponchoice == "dagger") //assuming that the player will decide the weapon choice.
{
   player.mainHand = new Dagger();
} 
else if(player.weaponchoice == "sword")
{
   player.mainHand = new Sword();
}

答案 2 :(得分:0)

可以为武器引用分配任何扩展武器的对象。 所以如果俱乐部延伸武器,你可以写:

this->mainHand = new Club();
但是,

mainHand只能在Weapon类中调用public和protected方法。

this->mainHand->fire();

如果你想调用特定于俱乐部的方法,你必须投出它,但不需要这样做!

((Club *) this->mainHand)->beatToDeath(); 

答案 3 :(得分:0)

请参阅以下示例。请根据您的需要采用。

class Weapon
{
public:
    virtual void fire()=0;
};

class Gun:public Weapon
{
public:
    void fire()override
    {
        std::cout<<"Gun\n";
    }
};

class Rifle:public Weapon
{
public:
    void fire()override
    {
        std::cout<<"Rifle\n";
    }
};

class Player
{
public:
    Player(Weapon* weapon):mainHand(weapon)
    {
    }
    void fire()
    {
        mainHand->fire();
    }
private:
Weapon * mainHand;  // I think this is what I want?
};
int _tmain(int argc, _TCHAR* argv[])
{
    Gun gun;
    Rifle rifle;
    Player p1(&gun);
    Player p2(&rifle);
    p1.fire();
    p2.fire();
}