Несколько типов в одном векторе C++

Интересно, смогу ли я хранить разные типы не родных данных в одном векторе? это выглядит так:

class foo
{
    private:
        int x;
    public:
        foo(int a=0):x(a){}
        int getx() { return x; }
        void setx(int a=0) { x=a; }
};
class var:public foo
{
    private:
        int y;
    public:
        var(int a=0, int b=0):foo(a), y(b){}
        int gety() { return y; }
        void sety(int a=0) { y=a; }
};
class var1:public foo
{
    private:
        int z;
    public:
        var(int a=0, int b=0):foo(a), z(b){}
        int getz() { return z; }
        void setz(int a=0) { z=a; }
};

Как объявить вектор для хранения данных обоих var а также var1 типы? Я мог бы хранить их в std::vector<foo>, но тогда они будут рассматриваться как если бы они foo типы

2 ответа

Решение

Если вы добавите подтип foo к std::vector<foo>, вы потеряете информацию подтипа. Смотрите Что такое нарезка объектов? для получения дополнительной информации.

std::vector<foo> контейнер может содержать только объекты типа foo, Чтобы иметь возможность хранить объекты, полученные из foo, вам придется размещать объекты в куче и хранить указатели в vector указателей, предпочтительно vector умных указателей - std::vector<std::shared_ptr<foo>> или же std::vector<std::unique_ptr<foo>>,

Вы можете использовать полиморфизм. Так что вместо того, чтобы объявить std::vector<foo>Вы объявляете указатель базового класса: std::vector<foo*>,

Тогда в вашей функции вы можете объявить как

vector<foo*> bar;

bar.push_back( new var1() );
Другие вопросы по тегам