制作一个可以存储子类对象的超类类型的向量

时间:2017-09-20 14:26:49

标签: c++ oop pointers vector

所以我在学习的时候开始了一个小小的项目。基本上,我正在尝试做的是一个小小的“游戏”,我计划在学习新东西的基础上进行构建。

这是一个简短的描述和我的问题。

基本上,我想根据他们的选择为玩家分配各种英雄类型。

到目前为止,我只使用HP参数创建了一个基类“Hero”。之后,我从Hero,HeroType1,HeroType2中创建了2个派生类,它们具有特定的能力,依此类推。

我决定在std::vector<Hero*> Heroes中存储各种英雄类型。基本上,我通过调用initializeHeroes函数来启动我的“游戏”,该函数根据玩家的选择创建一个NewHero1或NewHero2类型的新对象,并将其存储为前面提到的向量。问题是,无论我到目前为止尝试过什么,当我想稍后使用它们时,我都无法访问派生成员函数,只能访问Hero类的函数。

什么感觉是一个好的解决方案:声明全局变量player1,player2并在玩家选择HeroType后分配给他们。但是,我不能这样做,因为在编译之前必须知道数据类型。对不起,如果这是一个愚蠢而基本的问题,我的知识仍然非常有限,这就是我在这里要求一些提示的原因。

我很想问你将如何解决这个问题,我知道这是一个非常简单的问题,但我仍然是初学者,我正在努力找出解决这个问题的最佳方法。提前谢谢。

1 个答案:

答案 0 :(得分:2)

如果您想从std::vector<Hero*> Heroes中的元素调用成员函数,并且您知道该元素指向 Hero2 -type,那么您可以创建一个新的临时变量Hero2 * tmpPtr并将此变量设置为要调用其成员函数的元素(tmpPtr = Heroes[i])。然后你应该可以调用这样的成员函数:tmpPtr->hero2Memberfuncion()

完整代码:

#include <iostream>
#include <vector>

class SomeClass
{
public:
    void a() {
        std::cout << "a" << std::endl;
    }
};

class AnotherClass : public SomeClass
{
public:
    void b() {
        std::cout << "b" << std::endl;
    }
};

void main() {
    std::vector<SomeClass *> vec;
    AnotherClass v;
    vec.push_back(&v);

    AnotherClass * tmpPtr = (AnotherClass *)vec[0];
    tmpPtr->b(); //Output: "b"
}

但是,如果你想要循环遍历整个向量,并且为每个元素运行一个具有相同名称的成员函数,但该函数的主体根据元素指向的Hero类型而有所不同,那么你可能想要使用虚拟功能。例如:

#include <iostream>
#include <vector>

class SomeClass
{
public:
    virtual void a() {
        std::cout << "from SomeClass" << std::endl;
    }
};

class AnotherClass : public SomeClass
{
public:
    void a() {
        std::cout << "from AnotherClass" << std::endl;
    }
};

void main() {
    std::vector<SomeClass *> vec;

    AnotherClass v1;
    vec.push_back(&v1);
    vec[0]->a(); //Output: "from AnotherClass"

    SomeClass v2;
    vec.push_back(&v2);
    vec[1]->a(); //Output: "from SomeClass"
}