1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| #include <iostream>
struct Renderer { virtual void render_circle(float x, float y, float radius) = 0; };
struct VectorRenderer : Renderer { void render_circle(float x, float y, float radius) override { std::cout << "Rasterizing circle of radius " << radius << std::endl; } };
struct RasterRenderer : Renderer { void render_circle(float x, float y, float radius) override { std::cout << "Drawing a vector circle of radius " << radius << std::endl; } };
struct Shape { protected: Renderer& renderer; Shape(Renderer& renderer) : renderer{ renderer } {} public: virtual void draw() = 0; virtual void resize(float factor) = 0; };
struct Circle : Shape { float x, y, radius; Circle(Renderer& renderer, float x, float y, float radius) : Shape{renderer}, x{x}, y{y}, radius{radius} {}
void draw() override { renderer.render_circle(x, y, radius); }
void resize(float factor) override { radius *= factor; } };
int main(void) { RasterRenderer rr; Circle raster_circle{ rr, 5, 5, 5 }; raster_circle.draw(); raster_circle.resize(2); raster_circle.draw();
return 0; }
|