    #include <memory>

    struct X
    {
        virtual ~X() { }
    };

    struct Y : X
    {
    };

    int main()
    {
        std::shared_ptr<X> pX = std::make_shared<Y>();
        std::shared_ptr<Y> pY = std::dynamic_pointer_cast<Y>(pX);
    }
