#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();
    }
}