В вашей иерархии Собака наследует от Животного. Это означает, что когда Собака строится, Животное, его родитель, конструируется первым. Вот почему, когда вы создаете Собаку, вы получаете «Животное создано» и «Собака создано».
Чтобы избежать других проблем, вы должны следовать правилу 3: у вас нетривиальный деструктор, поэтому вам также следует определить конструктор копирования и оператор присваивания. В противном случае у вас будет двойная и / или свободная память.
Кроме того, поскольку у вас могут быть нетривиальные дети в Animal, вы должны сделать деструктор виртуальным. В противном случае
std::unique_ptr<Animal> ptr = std::make_unique<Dog>();
без виртуального деструктора в Animal, деструктор Dog никогда не будет вызван.