#include <list>
#include <memory>
#include <iostream>
using namespace std;

struct mybase{
    virtual void proc(){
        cout << "I'm mybase" << endl;
    }
    virtual ~mybase() {} // don't forget this!
};

struct myderiv: public mybase{
    void proc(){
        cout << "I'm myderiv" << endl;
    }
};

int main(){
    myderiv a;
    a.proc();

    mybase *b = &a;
    b->proc();

    list<unique_ptr<mybase>> c;
    c.push_back(unique_ptr<mybase>(new myderiv(a)));
    list<unique_ptr<mybase>>::iterator it = c.begin();
    (*it)->proc();

    return 0;
}
