У вас странная функция find():
base* base::find(string name) {
base* object = nullptr;
for (base* element : this->components) {
if (element->get_name() == name)
object = element;
if (object == nullptr) {
object = element->find(name);
}
return object;
}
}
Она не ищет дальше первого элемента components. obj3 она соответственно и не находит, программа валится на касте nullptr к object2
if (classNumber == 2)
inner_component = dynamic_cast <object2*>(primary.find(head_name));
(не понимаю, зачем столько кастов)