#include <iostream>
#include <array>
#include <memory>
class Base {
public:
virtual ~Base() {
std::cout << "Base destroyed\n";
}
virtual void hello() {
std::cout << "This shouldn't print\n";
}
};
class Child1 : public Base {
public:
~Child1() override {
std::cout << "Child1 destroyed\n";
}
void hello() override {
std::cout << "Hi from child 1!\n";
}
};
class Child2 : public Base {
public:
~Child2() override {
std::cout << "Child2 destroyed\n";
}
void hello() override {
std::cout << "Hi from child 2!\n";
}
};
int main() {
std::array<std::unique_ptr<Base>, 2> array = {
std::make_unique<Child1>(),
std::make_unique<Child2>()
};
for (auto &i : array) {
i->hello();
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YXJyYXk+CiNpbmNsdWRlIDxtZW1vcnk+CgpjbGFzcyBCYXNlIHsKICAgIHB1YmxpYzoKICAgIAl2aXJ0dWFsIH5CYXNlKCkgewogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIkJhc2UgZGVzdHJveWVkXG4iOwogICAgCX0KICAgIAkKICAgICAgICB2aXJ0dWFsIHZvaWQgaGVsbG8oKSB7IAogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlRoaXMgc2hvdWxkbid0IHByaW50XG4iOwogICAgICAgIH0KfTsKCmNsYXNzIENoaWxkMSA6IHB1YmxpYyBCYXNlIHsKICAgIHB1YmxpYzoKICAgIAl+Q2hpbGQxKCkgb3ZlcnJpZGUgewogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIkNoaWxkMSBkZXN0cm95ZWRcbiI7CiAgICAJfQoKICAgICAgICB2b2lkIGhlbGxvKCkgb3ZlcnJpZGUgewogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIkhpIGZyb20gY2hpbGQgMSFcbiI7CiAgICAgICAgfQp9OwoKY2xhc3MgQ2hpbGQyIDogcHVibGljIEJhc2UgewogICAgcHVibGljOgogICAgCX5DaGlsZDIoKSBvdmVycmlkZSB7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiQ2hpbGQyIGRlc3Ryb3llZFxuIjsKICAgIAl9CgogICAgICAgIHZvaWQgaGVsbG8oKSBvdmVycmlkZSB7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiSGkgZnJvbSBjaGlsZCAyIVxuIjsKICAgICAgICB9Cn07CiAKaW50IG1haW4oKSB7CiAgICBzdGQ6OmFycmF5PHN0ZDo6dW5pcXVlX3B0cjxCYXNlPiwgMj4gYXJyYXkgPSB7CiAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDaGlsZDE+KCksCiAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDaGlsZDI+KCkKICAgIH07CgogICAgZm9yIChhdXRvICZpIDogYXJyYXkpIHsKICAgICAgICBpLT5oZWxsbygpOwogICAgfQp9