Существует некая незавершённость схемы конструкторов в C++, в котором из-за автоматического вызова конструкторов подобъектов (предков) сложно описать конструирование объекта как целого в одном месте, поэтому конструкторы C++ правильнее называть инициализаторами.
Таким образом, логичнее было бы иметь два шага: автоматический вызов инициализаторов предков (например, с обнулением указателей) и последующий автоматический же вызов общего конструктора. И в C++ это реализуемо! Для этого во всех классах нужно ввести инициализаторы (защищённые конструктор по умолчанию или конструкторы с фиктивным параметром) и в конструкторах потомка явно задавать именно их (чтобы подавить вызов конструкторов вместо инициализаторов предков). Если же код конструкторов выносить в отдельные [виртуальные] методы, то можно будет вызывать их в конструкторах потомков.
С деструкторами сложнее, поскольку в классе их не может быть более одного, поэтому можно ввести отдельные методы (типа shutdown и destroy). Теперь остаётся либо убрать деструкторы (хотя придётся явно вызывать методы деструкции), либо ввести общий признак, запрещающий деструкторам предков разрушать, и при переопределении метода деструкции переопределять также деструктор. И не забывайте делать их виртуальными!
А ведь писали же (да хотя бы А. Голуб) - не вызывайте виртуальных методов из конструкторов и деструкторов! Ан нет - все равно хотят вызывать... А знает ли благородный дон, что во-время работы конструктора таблица виртуальных функций еще не заполнена и если происходит вызов виртуального метода то вызываться будет метод с текущего уровня наследования. А что будет происходить при вызове виртуального метода из деструктора - так это вообще чума - возможно будет ситуация "на кого бог пошлет". В общем, как говорится - "избегайте странностей!"