Интересно, смогу ли я хранить разные типы не родных данных в одном векторе?
это выглядит так:
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
типы
Если вы добавите подтип 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() );