#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==