#include #include class Base { int observed_; public: Base() : observed_(kind()) {} virtual int kind() const { return 1; } int observed_during_construction() const { return observed_; } virtual std::unique_ptr clone() const = 0; virtual ~Base() = default; }; class Derived final : public Base { public: int kind() const override { return 2; } std::unique_ptr clone() const override { return std::make_unique(*this); } }; std::unique_ptr make_object() { return std::make_unique(); } int main() { auto object = make_object(); assert(object->observed_during_construction() == 1); assert(object->kind() == 2); auto copy = object->clone(); assert(copy.get() != object.get()); assert(copy->kind() == 2); }