Глава 17. Конструкторы: копирование и присваивание_________________425

Копирование и присваивание в дочерних классах

В табл. 17.1 недвусмысленно указано, что конструктор копий не наследуется. Наследование подробно освещено в главе 20 "Наследование и полиморфизм", но если в двух словах, то наследование — это алгоритм, в соответствии с которым компилятор заимствует элементы функциональности существующих типов для создания новых.

При выборе подходящего метода копирования не имеет значения, является ли ваш класс самостоятельным или же частью разветвленной иерархической структуры. Чаще всего для производных классов используется копирование того же типа, что и для их родителей. Однако никто не запрещает вам при необходимости копирование заблокировать.

Предмет нашего обсуждения — копирование объектов производных классов. Здесь может быть полезно остановиться и, прежде чем продолжить, прочитать главу 20. Если для родительского класса уже определены, копирование и присваивание, то весь фокус состоит в том, чтобы извлечь из них максимальную пользу. Прочитав предыдущий раздел "Реализация копирования через присваивание", вы легко обеспечите копирование унаследованной части объекта. Рассмотрим следующий класс в, производный от класса А:

// Читается так: класс В открыто выводится из А

class В : public A

{

public:

В(); // Конструктор

~В(); // Деструктор

Х( const X&); // Конструктор копий

Х& operator"( const X&); // Присваивание private:

// etc. }

С классом А все в порядке; он полностью определен, отлажен и работоспособен. в — это класс, который определен как потомок А. Предположим, что конструктор копий для в реализован средствами присваивания класса в, тогда:

// Конструктор копий

В::В( const B& rhs)

{ operator = (rhs); } // пусть эту работу

// делает операция присваивания ,

// Операция присваивания

Bs В::operator=( const B& rhs)

{

if ( this == Srhs) return *this;

A::operator"(rhs); // копирование наследства класса А