При вызове виртуальной функции из конструктора или деструктора полиморфизм не работает так, как обычно.
Из конструктора:
- Будет вызвана реализация виртуальной функции, соответствующая типу текущего конструктора (т.е. класса, чей конструктор выполняется). Реализации из производных классов не будут доступны, так как объекты производных классов еще не полностью построены.
Из деструктора:
- Аналогично, будет вызвана реализация виртуальной функции, соответствующая типу текущего деструктора. После выполнения деструктора базового класса, часть объекта, соответствующая производному классу, уже разрушена.
Почему так?
- На этапе конструирования объекта производного класса, его части, унаследованные от базовых классов, создаются последовательно. Пока конструктор производного класса не завершился, объект еще не является полноценным экземпляром производного класса.
- На этапе деструктирования происходит обратный процесс: сначала вызывается деструктор производного класса, затем деструкторы базовых классов в порядке, обратном конструированию. К моменту вызова деструктора базового класса, часть объекта, соответствующая производному классу, уже уничтожена.
Пример:
c