#include <memory>
#include <vector>
#include <iostream>
struct base {
virtual void muu() = 0;
};
struct monster1 : public base {
virtual void muu() { std::cout << "muuuu\n"; }
};
struct monster2 : public base {
virtual void muu() { std::cout << "miau\n"; }
};
int main() {
std::vector< std::unique_ptr<base> > potworki;
potworki.emplace_back(); // dodaje nowy element na koncu wektora
potworki.back().reset(new monster1); // bierze ostatnio dodany element, za pomoca .reset ustawiasz wskaznik na nowo zrobiony obiekt
potworki.emplace_back(new monster2); // mozna tez tak, jako ze konstruktor unique_ptr moze przyjac pointer na element podklasy base
for(auto& potworek : potworki) {
potworek->muu();
}
}
I2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IGJhc2UgewogICAgdmlydHVhbCB2b2lkIG11dSgpID0gMDsKfTsKCnN0cnVjdCBtb25zdGVyMSA6IHB1YmxpYyBiYXNlIHsKICAgIHZpcnR1YWwgdm9pZCBtdXUoKSB7IHN0ZDo6Y291dCA8PCAibXV1dXVcbiI7IH0KfTsKCnN0cnVjdCBtb25zdGVyMiA6IHB1YmxpYyBiYXNlIHsKICAgIHZpcnR1YWwgdm9pZCBtdXUoKSB7IHN0ZDo6Y291dCA8PCAgIm1pYXVcbiI7IH0KfTsKCmludCBtYWluKCkgewogICAgc3RkOjp2ZWN0b3I8IHN0ZDo6dW5pcXVlX3B0cjxiYXNlPiA+ICBwb3R3b3JraTsKICAgIHBvdHdvcmtpLmVtcGxhY2VfYmFjaygpOyAvLyBkb2RhamUgbm93eSBlbGVtZW50IG5hIGtvbmN1IHdla3RvcmEKICAgIHBvdHdvcmtpLmJhY2soKS5yZXNldChuZXcgbW9uc3RlcjEpOyAvLyBiaWVyemUgb3N0YXRuaW8gZG9kYW55IGVsZW1lbnQsIHphIHBvbW9jYSAucmVzZXQgdXN0YXdpYXN6IHdza2F6bmlrIG5hIG5vd28genJvYmlvbnkgb2JpZWt0CiAgICAKICAgIHBvdHdvcmtpLmVtcGxhY2VfYmFjayhuZXcgbW9uc3RlcjIpOyAvLyBtb3puYSB0ZXogdGFrLCBqYWtvIHplIGtvbnN0cnVrdG9yIHVuaXF1ZV9wdHIgbW96ZSBwcnp5amFjIHBvaW50ZXIgbmEgZWxlbWVudCBwb2RrbGFzeSBiYXNlCiAgICAKICAgIGZvcihhdXRvJiBwb3R3b3JlayA6IHBvdHdvcmtpKSB7CiAgICAgICAgcG90d29yZWstPm11dSgpOwogICAgfQp9