#include <iostream>
#include <memory>
#include <vector>
class Parent
{
public:
virtual ~Parent() = default;
virtual void dofunc() = 0;
};
class Child1: public Parent
{
public:
void dofunc()
{
std::cout << "Child 1\n";
}
};
class Child2: public Parent
{
public:
void dofunc()
{
std::cout << "Child 2\n";
}
};
void myFunc(Parent *c)
{
c->dofunc();
}
int main()
{
std::vector<std::unique_ptr<Parent>> v;
v.push_back(std::make_unique<Child1>()); // use smart pointers to manage the alloccation
v.push_back(std::make_unique<Child2>());
myFunc(v[0].get());
myFunc(v[1].get());
//we could just as easily
v[0]->dofunc();
// in most cases, but sonmewtimes it's good/useful to hide what's really going on
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dmVjdG9yPgoKY2xhc3MgUGFyZW50CnsKcHVibGljOgogICAgdmlydHVhbCB+UGFyZW50KCkgPSBkZWZhdWx0OwogICAgdmlydHVhbCB2b2lkIGRvZnVuYygpID0gMDsKfTsKCmNsYXNzIENoaWxkMTogcHVibGljIFBhcmVudAp7CnB1YmxpYzoKICAgIHZvaWQgZG9mdW5jKCkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkNoaWxkIDFcbiI7CiAgICB9Cn07CgpjbGFzcyBDaGlsZDI6IHB1YmxpYyBQYXJlbnQKewpwdWJsaWM6CiAgICB2b2lkIGRvZnVuYygpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJDaGlsZCAyXG4iOwogICAgfQp9OwoKdm9pZCBteUZ1bmMoUGFyZW50ICpjKQp7CiAgICBjLT5kb2Z1bmMoKTsKfQoKaW50IG1haW4oKQp7CiAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8UGFyZW50Pj4gdjsKCiAgICB2LnB1c2hfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPENoaWxkMT4oKSk7IC8vIHVzZSBzbWFydCBwb2ludGVycyB0byBtYW5hZ2UgdGhlIGFsbG9jY2F0aW9uCiAgICB2LnB1c2hfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPENoaWxkMj4oKSk7CgogICAgbXlGdW5jKHZbMF0uZ2V0KCkpOwogICAgbXlGdW5jKHZbMV0uZ2V0KCkpOwogICAgLy93ZSBjb3VsZCBqdXN0IGFzIGVhc2lseSAKICAgIHZbMF0tPmRvZnVuYygpOwogICAgLy8gaW4gbW9zdCBjYXNlcywgYnV0IHNvbm1ld3RpbWVzIGl0J3MgZ29vZC91c2VmdWwgdG8gaGlkZSB3aGF0J3MgcmVhbGx5IGdvaW5nIG9uCiAgICAKICAgIHJldHVybiAwOwp9Cg==