Создание контейнеров полиморфных типов - это классическое решение, которое имеет свои проблемы. Один из типов должен стать полиморфным только для того, чтобы добавить их в контейнер - не веская причина. Другая проблема - раннее и жесткое соединение, приводящее к более сложному обслуживанию и отсутствию гибкости, просто для того, чтобы добавить их в контейнер - не веская причина. К счастью, в C ++ есть лучшие альтернативы.
Лучшим решением было бы хранение функций, а не самих объектов в контейнерах. Общая причина, по которой вы хотите поместить разные типы в один и тот же контейнер, состоит в том, чтобы выполнять одинаковые действия для всех них, например, Sphere::Draw()
или Plane::Draw()
. Вместо этого вы можете создать контейнер функций рисования и стереть тип. Э.Г.
vector<function<void()>> drawings;
Sphere s;
Plane p;
drawings.push_back(bind(s, &Sphere::Draw));
drawings.push_back(bind(p, &Plane::Draw));
for(auto I = drawings.begin(); I != drawings.end(); ++i) (*i)();
Тем самым вы избежали сильной связи и других проблем наследования и получили более гибкое, более общее решение.
Приведенное выше решение работает только с C ++ 11 , так как требует std :: function ()