#include <iostream>
#include <memory>
#include <random>
#include <vector>

class Base
{
public:
    virtual void foo() = 0;
    
    virtual ~Base()
    {}
};

class DerivedA : public Base
{
public:
    virtual void foo()
    {
        std::cout << "Hello from DerivedA!\n";
    }
};

class DerivedB : public Base
{
public:
    virtual void foo()
    {
        std::cout << "Hello from DerivedB!\n";
    }
};

int main()
{
    std::vector<std::unique_ptr<Base>> bases;
    
    std::default_random_engine e(3765928);
    std::uniform_int_distribution<> d(0, 1);
    
    for (std::size_t i = 100; i-- != 0; )
    {
        if (d(e))
            bases.push_back(std::unique_ptr<DerivedA>(new DerivedA));
        else
            bases.push_back(std::unique_ptr<DerivedB>(new DerivedB));
    }
        
    for (auto i = bases.begin(); i != bases.end(); ++i)
        (*i)->foo();
}