56 lines
1010 B
C++
56 lines
1010 B
C++
#include <iostream>
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
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<shared_ptr<Shape>> shapes;
|
|
public:
|
|
void add_shape(shared_ptr<Shape> item) {
|
|
shapes.push_back(item);
|
|
}
|
|
|
|
virtual void draw() {
|
|
cout << "draw group" << endl;
|
|
for (auto item : shapes) {
|
|
item->draw();
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
int main() {
|
|
auto s1 = make_shared<Square>();
|
|
auto s2 = make_shared<Square>();
|
|
auto c1 = make_shared<Circle>();
|
|
auto sg = make_shared<ShapeGroup>();
|
|
|
|
sg->add_shape(s1);
|
|
sg->add_shape(s2);
|
|
sg->add_shape(c1);
|
|
sg->draw();
|
|
}
|
|
|