Вам нужно выбросить эти "материалы C ++" в мусорное ведро.
Вы, конечно, можете вызывать виртуальные функции из конструктора или деструктора. И они сделают свою работу. Вам просто нужно знать спецификацию языка, в которой четко указано, что механизм виртуальной диспетчеризации работает в соответствии с current динамическим типом объекта, а не с его final предполагаемым динамическим типом. Эти типы не одинаковы для строящегося / уничтожаемого объекта, что часто сбивает с толку новичков, когда они пытаются вызвать виртуальные функции из конструкторов / деструкторов. Тем не менее, вызов виртуальных функций из конструктора и деструктора является полезной функцией языка, если вы знаете, что они делают и как они работают в таких случаях. Почему вы хотите «предотвратить» это?
Это все равно что говорить, что оператор деления опасен, поскольку можно делить что-то на ноль, и спрашивать, как «предотвратить» его использование в программе.