Как уже упоминалось, вам нужны функции virtual
, чтобы включить полиморфное поведение, и вы не можете хранить классы напрямую по значению в vector
.
Когда вы используете std::vector<A>
, вы сохраняете по значению и, таким образом, объекты, которые вы добавляете, например, через push_back()
копируются в экземпляр A
, что означает, что вы теряете производную часть объектов. Эта проблема известна как нарезка объектов .
Как уже предлагалось, этого можно избежать, сохранив указатели (или умные указатели ) на базовый класс, поэтому в vector
копируются только указатели:
std::vector<A*> things;
things.push_back(new B());
// ... use things:
things[0]->print();
// clean up later if you don't use smart pointers:
for(std::vector<A*>::iterator it = things.begin(); it != things.end(); ++it)
delete *it;