#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IGJhc2UgewogICAgdmlydHVhbCB+YmFzZSgpIHt9CiAgICB2aXJ0dWFsIHZvaWQgZnVuYygpID0gMDsKfTsKCnN0cnVjdCBkZXJpdmVkIDogcHVibGljIGJhc2UgewogICAgZGVyaXZlZCgpIHsgc3RkOjpjb3V0IDw8ICJEZXJpdmVkIGJlaW5nIGNyZWF0ZWQgLS0gdGhpcyA9ICIgPDwgdGhpcyA8PCAnXG4nOyB9CiAgICB2aXJ0dWFsIHZvaWQgZnVuYygpIG92ZXJyaWRlIHsgfQogICAgfmRlcml2ZWQoKSB7IHN0ZDo6Y291dCA8PCAiRGVyaXZlZCBiZWluZyBkZXN0cm95ZWQgLS0gdGhpcyA9ICIgPDwgdGhpcyA8PCAnXG4nOyB9Cn07CgpzdHJ1Y3QgYmFzZV9oYXZlciB7CiAgICBiYXNlX2hhdmVyKCkgOiBiYXNlX2hhdmVyKGRlcml2ZWR7fSkKICAgIHsKICAgIAlzdGQ6OmNvdXQgPDwgIkluIHRoZSBiYXNlX2hhdmVyIGNvbnN0cnVjdG9yIGJvZHkgbm93XG4iOwogICAgfSAvLyBQcm92aWRlcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uCiAgICBiYXNlX2hhdmVyKGJhc2UgJiYgYikgOiBtQmFzZShiKSAKICAgIHt9IC8vIENhbGxlciBwcm92aWRlcyBpbXBsZW1lbnRhdGlvbgoKICAgIHZvaWQgY2FsbF9mdW5jKCkgeyBtQmFzZS5mdW5jKCk7IH0KCiAgICBiYXNlICYgbUJhc2U7Cn07CgppbnQgbWFpbigpCnsKICAgIGJhc2VfaGF2ZXIgYjsKfQo=