#include <memory>
 
struct Base : std::enable_shared_from_this<Base>
{};
 
 
struct Derived : Base
{
        std::shared_ptr<Derived> shared_from_this() { return std::static_pointer_cast<Derived>(Base::shared_from_this()); }
};
 
main()
{
  std::shared_ptr<Derived> ptr(new Derived);
 
  std::shared_ptr<Derived> d_ptr = ptr->shared_from_this();
 
  std::shared_ptr<Base> b_ptr = ptr->shared_from_this();
}
				I2luY2x1ZGUgPG1lbW9yeT4KCnN0cnVjdCBCYXNlIDogc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxCYXNlPgp7fTsKCgpzdHJ1Y3QgRGVyaXZlZCA6IEJhc2UKewogICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxEZXJpdmVkPiBzaGFyZWRfZnJvbV90aGlzKCkgeyByZXR1cm4gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PERlcml2ZWQ+KEJhc2U6OnNoYXJlZF9mcm9tX3RoaXMoKSk7IH0KfTsKCm1haW4oKQp7CiAgc3RkOjpzaGFyZWRfcHRyPERlcml2ZWQ+IHB0cihuZXcgRGVyaXZlZCk7CgogIHN0ZDo6c2hhcmVkX3B0cjxEZXJpdmVkPiBkX3B0ciA9IHB0ci0+c2hhcmVkX2Zyb21fdGhpcygpOwoKICBzdGQ6OnNoYXJlZF9wdHI8QmFzZT4gYl9wdHIgPSBwdHItPnNoYXJlZF9mcm9tX3RoaXMoKTsKfQ==