#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;
}
I2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDxtZW1vcnk+CiNpbmNsdWRlIDxpb3N0cmVhbT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBteWJhc2V7CiAgICB2aXJ0dWFsIHZvaWQgcHJvYygpewogICAgICAgIGNvdXQgPDwgIkknbSBteWJhc2UiIDw8IGVuZGw7CiAgICB9CiAgICB2aXJ0dWFsIH5teWJhc2UoKSB7fSAvLyBkb24ndCBmb3JnZXQgdGhpcyEKfTsKCnN0cnVjdCBteWRlcml2OiBwdWJsaWMgbXliYXNlewogICAgdm9pZCBwcm9jKCl7CiAgICAgICAgY291dCA8PCAiSSdtIG15ZGVyaXYiIDw8IGVuZGw7CiAgICB9Cn07CgppbnQgbWFpbigpewogICAgbXlkZXJpdiBhOwogICAgYS5wcm9jKCk7CgogICAgbXliYXNlICpiID0gJmE7CiAgICBiLT5wcm9jKCk7CgogICAgbGlzdDx1bmlxdWVfcHRyPG15YmFzZT4+IGM7CiAgICBjLnB1c2hfYmFjayh1bmlxdWVfcHRyPG15YmFzZT4obmV3IG15ZGVyaXYoYSkpKTsKICAgIGxpc3Q8dW5pcXVlX3B0cjxteWJhc2U+Pjo6aXRlcmF0b3IgaXQgPSBjLmJlZ2luKCk7CiAgICAoKml0KS0+cHJvYygpOwoKICAgIHJldHVybiAwOwp9Cg==