#include <iostream>
#include <memory>

using namespace std;

struct Parent{
    virtual void funky() = 0;
    virtual ~Parent(){}
};

struct Child1 : Parent{
    void funky(){cout << "Child 1";}
};

struct Child2 : Parent{
    void funky(){cout << "Child 2";}
};

int main()
{
    shared_ptr<Parent> ptr(new Child1());
    ptr->funky();
    cout << '\n';
    ptr.reset(new Child2());
    ptr->funky();
    cout << '\n';

    return 0;
}