Справочное руководство по C++

R.12.7 Конструкторы и деструкторы.

В конструкторах и деструкторах можно вызывать функцию-член. Отсюда следует, что можно вызывать (непосредственно или косвенно) виртуальные функции. Вызываемая функция должна быть определена в классе самого конструктора или деструктора или в базовых классах, но не должна быть функцией, которая их подавляет в производном классе. Этим обеспечивается то, что еще несозданные объекты не будут использованы при выполнении конструктора или деструктора. Рассмотрим пример:

Class X {

Public:

 virtual void f();

 X() { f(); } // вызов X::f().

 ~X() { f(); } // вызов X::f().

};

Class Y: public X {

 int& r;

Public:

 void f().

 {

  r++; // беда, если `r' не инициализировано.

 }

 Y(int& rr)::r(rr) {}.

};

Результат непосредственного или косвенного вызова из конструктора чистой виртуальной функции для инициализируемого объекта неопределен, если только явно не использовано уточнение имени функции (§R.10.3).