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