#include #include #include #include #include struct Log { std::array entries{}; std::size_t used = 0; void add(int n) noexcept { entries[used++] = n; } }; struct Owned { Log& log; explicit Owned(Log& l) : log(l) {} virtual ~Owned() { log.add(2); } }; struct Impl final : Owned { explicit Impl(Log& l) : Owned(l) {} ~Impl() override { log.add(1); } }; class Borrowed { public: virtual int value() const = 0; protected: ~Borrowed() = default; }; struct Concrete final : Borrowed { int value() const override { return 7; } }; int main() { Log log; { std::unique_ptr object = std::make_unique(log); } const std::array expected{{1, 2}}; assert(log.entries == expected && log.used == 2); static_assert(!std::is_destructible::value, "external deletion forbidden"); Concrete concrete; const Borrowed& view = concrete; assert(view.value() == 7); }