#include <functional>
#include <iostream>
class base {
public:
std::function<void()> Do;
base() :Do(std::bind(&base::Do_impl, this)){}
protected:
base(std::function<void()> d) :Do(std::move(d)){}
void Do_impl() const {std::cout << "base";}
};
class derived : public base{
public:
derived() :base(std::bind(&derived::Do_impl, this)){}
protected:
void Do_impl() const {std::cout << "derived";}
};
int main() {
derived d;
d.Do();
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCmNsYXNzIGJhc2UgewpwdWJsaWM6CiAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gRG87CiAgICBiYXNlKCkgOkRvKHN0ZDo6YmluZCgmYmFzZTo6RG9faW1wbCwgdGhpcykpe30KcHJvdGVjdGVkOgogICAgYmFzZShzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gZCkgOkRvKHN0ZDo6bW92ZShkKSl7fQogICAgdm9pZCBEb19pbXBsKCkgY29uc3Qge3N0ZDo6Y291dCA8PCAiYmFzZSI7fSAgICAKfTsKY2xhc3MgZGVyaXZlZCA6IHB1YmxpYyBiYXNlewpwdWJsaWM6CiAgICBkZXJpdmVkKCkgOmJhc2Uoc3RkOjpiaW5kKCZkZXJpdmVkOjpEb19pbXBsLCB0aGlzKSl7fQpwcm90ZWN0ZWQ6CiAgICB2b2lkIERvX2ltcGwoKSBjb25zdCB7c3RkOjpjb3V0IDw8ICJkZXJpdmVkIjt9Cn07CgppbnQgbWFpbigpIHsKICAgIGRlcml2ZWQgZDsKICAgIGQuRG8oKTsKfQo=