Не совсем понятно почему сразу после создания объекта вызывается его деструктор.
IShape *shape = &Rectangle(5, 5);
IShape это базовый класс для Rectangle.
Однако после серии вызовов деструкторов от Rectangle, IShape все равно получает адрес какого-то инициализированного объекта в точности как Rectangle(5, 5).
Во-первых, если вы не реализовали какую-то свою версию перегруженного оператора &, этот код некомпилируем в принципе. Результатом выражения Rectangle(5, 5) является временный объект. В С++ запрещается применять встроенный угарный оператор & ко временным объектам. То есть никакого "сразу вызывается его деструктор" тут нет - код просто некорректен.
Во-вторых, как сказано выше, выражение Rectangle(5, 5) создает временный объект. И да, за исключением ряда специальных случаев, такой объект существует лишь до конца того выражения, которое его создало. То есть деструктор для таких объектов вызывается не "сразу", но "почти сразу". Не было бы ничего удивительного в быстром уничтожении такого объекта (если бы ваш код был корректным).
Сборка персонального компьютера от Artline: умный выбор для современных пользователей