Вам необходимо реализовать метод виртуального клона для каждого объекта в иерархии. Как иначе ваш объект неопределенного типа узнает, как копировать себя?
Чтобы сделать это более очевидным для людей, пишущих производные классы, вы можете подумать о том, чтобы сделать метод клонирования абстрактным и в вашем базовом классе, чтобы заставить людей хотя бы что-то написать.
В нескольких местах для моего кода я также проверяю, чтобы убедиться, что метод to_string () реализован правильно для сериализации объекта в строку. Конкретный тест, который я использовал в своем классе для одновременного тестирования clone и to_string, выглядит следующим образом:
Base *obj1, *obj2;
# initialize obj1 in a reasonable manner
obj2 = obj1->clone();
assert( obj1->to_string() == obj2->to_string() );
Это тестирование метода clone () и сериализации объектов в строки (так что это не строго модульный тест), но это парадигма, которую просто обернуть в цикле вокруг всех объектов на фабрике, чтобы убедиться, что они следуют некоторому минимальному стандарту реализации clone () и to_string ().
Редактировать: Обновлен код с исправлением из комментария Страгера. Спасибо!