Сначала производная, потом база. Нет разницы в не виртуальных случаях.
Дополнительное примечание. Когда у вас есть наследование и виртуальные методы, вы должны объявить деструкторы как виртуальные, иначе вы можете иметь неопределенное поведение при удалении.
Например, предположим, что Derived получен из Base, и вы выделяете Derived со следующей строкой:
Base *o = new Derived();
delete(o);
Если этот случай встречается в вашем коде, а в Base нет виртуального деструктора, результирующее поведение не определено. Как правило, вызывается только деструктор базы. Деструктор Derived не будет вызван, потому что вы вызываете delete для базового указателя. Тем не менее, программа может аварийно завершить работу. Как только вы попадаете в область неопределенного поведения, все ставки отменяются, а ваш исполняемый код обречен. Для предотвращения хаоса Базовый деструктор должен быть виртуальным.