Type erasure — hiding concrete type behind a generic interface. Examples: std::function, std::any.
1// Simple type erasure example2class Drawable {3 struct Concept {4 virtual void draw() const = 0;5 virtual ~Concept() = default;6 };78 template<typename T>9 struct Model : Concept {10 T obj;11 Model(T o) : obj(std::move(o)) {}12 void draw() const override { obj.draw(); }13 };1415 std::unique_ptr<Concept> impl;1617public:18 template<typename T>19 Drawable(T obj) : impl(new Model<T>(std::move(obj))) {}2021 void draw() const { impl->draw(); }22};2324class Circle { public: void draw() const {} };25class Square { public: void draw() const {} };2627std::vector<Drawable> shapes;28shapes.emplace_back(Circle{});29shapes.emplace_back(Square{});30for (const auto& s : shapes) s.draw();
vs virtual inheritance: