#include #include #include using namespace std; class Shape { public: virtual void draw() = 0; virtual ~Shape() = default; }; class Square : public Shape { public: virtual void draw() { cout << "Square" << endl; } }; class Circle : public Shape { public: virtual void draw() { cout << "Circle" << endl; } }; // Both derived from shape, so that they can be treated as same class ShapeGroup : public Shape { vector> shapes; public: void add_shape(shared_ptr item) { shapes.push_back(item); } virtual void draw() { cout << "draw group" << endl; for (auto item : shapes) { item->draw(); } } }; int main() { auto s1 = make_shared(); auto s2 = make_shared(); auto c1 = make_shared(); auto sg = make_shared(); sg->add_shape(s1); sg->add_shape(s2); sg->add_shape(c1); sg->draw(); }