Язык программирования C++ для профессионалов


Виртуальные конструкторы - часть 3


class conditional : public expression { expr* cond; public: inline void copy(cond* s, int deep = 0); expr* clone(int deep = 0); // ... };

Функции copy() и clone() определяются подобно своим двойникам из expression:

expr* conditional::clone(int deep) { conditional* r = new conditional(); r->copy(this,deep); return r; }

void conditional::copy(expr* s, int deep) { if (deep == 0) { *this = *s; } else { expr::copy(s,1); // копируем часть expr cond = s->cond->clone(1); } }

Определение последней функции показывает отличие настоящего копирования в expr::copy() от полного размножения в expr::clone() (т.е. создания нового объекта и копирования в него). Простое копирование оказывается полезным для определения более сложных операций копирования и размножения. Различие между copy() и clone() эквивалентно различию между операцией присваивания и конструктором копирования и эквивалентно различию между функциями _draw() и draw(). Отметим, что функция copy() не является виртуальной. Ей и не надо быть таковой, поскольку виртуальна вызывающая ее функция clone(). Очевидно, что простые операции копирования можно также определять как функции-подстановки.




- Начало -  - Назад -  - Вперед -