Как заставить std::array различать родителя и наследника?
Танцы с virtual. Для того они и придуманы. 
Тут еще вопрос в том как именно вы помещаете объекты в std::array и какие именно это объекты. В вашем случае вам нужно помещать в массив либо ссылки, либо указатели (умные), иначе рискуете словить проблемы.
Это можно реализовать с помощью CRTP