#include <iostream>

struct base {
    virtual ~base() {}
    virtual void func() = 0;
};

struct derived : public base {
    derived() { std::cout << "Derived being created -- this = " << this << '\n'; }
    virtual void func() override { }
    ~derived() { std::cout << "Derived being destroyed -- this = " << this << '\n'; }
};

struct base_haver {
    base_haver() : base_haver(derived{})
    {
    	std::cout << "In the base_haver constructor body now\n";
    } // Provides default implementation
    base_haver(base && b) : mBase(b) 
    {} // Caller provides implementation

    void call_func() { mBase.func(); }

    base & mBase;
};

int main()
{
    base_haver b;
}
