#include #include class Printer { public: Printer() = default; virtual ~Printer() = default; virtual void print() const = 0; }; class Number_Printer : public Printer { public: Number_Printer(int value) : Printer{}, value {value} {} void print() const override { std::cout << value << std::endl; } private: int value; }; class Text_Printer : public Printer { public: Text_Printer(std::string const& value) : Printer{}, value {value} {} void print() const override { std::cout << "\"" << value << "\"" << std::endl; } private: std::string value; }; void print_something(Printer& p) { p.print(); } int main() { Number_Printer number { 5 }; Text_Printer text { "My text" }; print_something(number); print_something(text); }