Существуют различные проблемы с тем, что вы предлагаете, первая из которых уже рассмотрена в других ответах: вам нужны только виртуальные деструкторы, если вы собираетесь удалять с помощью указателя на базу (общая рекомендация - предоставить общедоступный виртуальныйдеструктор или защищенный не виртуальный деструктор, поскольку он будет препятствовать удалению через базовый класс).
Существует еще одна проблема, заключающаяся в том, что когда компилятор видит определение класса, он не может знать, будет ли он получен илине.Подумайте, реализуете ли вы базовый класс в модуле перевода.Позже вы выходите из класса.Если это деривация подразумевает виртуальный конструктор, необходимо перекомпилировать трансляцию базового класса, иначе ODR (одно правило определения) будет нарушено в вашей программе.
Если вы добавите другие единицы перевода в смесьвсе становится еще хуже.Всякий раз, когда вы включаете файл заголовка из модуля перевода, вы также будете вынуждены вручную включать хотя бы один заголовок, в котором определен производный объект из этого класса (увеличение связи), или же снова, компилятор будетсгенерировать другое определение для этого отдельного класса в этой единице перевода (по сравнению с единицей перевода, где определен производный класс), снова нарушая ODR.
Проблема в том, что компилятор имеет только частичное представление вашего проектаи не может на самом деле понять, что вам нужно / нужно из того, что он видит.