Да, вы можете сделать следующее:
Animal a;
if( happyDay() )
a = Animal( "puppies" );
else
a = Animal( "toads" );
Это будет правильно вызывать конструкторы.
РЕДАКТИРОВАТЬ: Забыли одну вещь ...
При объявлении a вам все равно придется вызывать конструктор, будь то конструктор, который ничего не делает или все равно инициализирует значения чем угодно. Поэтому этот метод создает два объекта, один при инициализации, а другой внутри оператора if.
Лучше было бы создать функцию класса init (), например:
Animal a;
if( happyDay() )
a.init( "puppies" );
else
a.init( "toads" );
Этот способ будет более эффективным.