Во-первых, вы не должны вручную вызывать деструкторы базового класса. Вызов деструктора для «хардкорной» работы с размещением новых; ваш пример - ошибка, потому что вы в конечном итоге уничтожите вещи «дважды», и ваша программа будет иметь неопределенное поведение.
В сущности вопроса: как повторить вызов данной функции для всех баз, не выписывая их все? Боюсь, вы не можете (если вы не унаследовали от пакета параметров). С ++ не имеет отражения , которое в противном случае могло бы позволить вам циклически переключаться между типами базовых классов.
К счастью, это очень редкая вещь, и даже тогда редко бывает так много баз , что проблема состоит в нескольких повторяющихся строках. И, опять же, здесь вы не представили хорошего обоснования для этого.