logo
volkov / 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).