Правила программирования на С и С++. Главы 7-8 - Конструкторы копий должны использовать списки инициализации членов

ОГЛАВЛЕНИЕ

130. Конструкторы копий должны использовать списки инициализации членов.

У наследования тоже есть свои проблемы с копированием. Конструктор копии все же остается конструктором, поэтому здесь также применимы результаты обсуждения предыдущего правила. Если у конструктора копии нет списка инициализации членов, то для базовых классов и вложенных объектов используется конструктор по умолчанию. Так как список инициализации членов отсутствует в следующем определении конструктора копии, то компонент базового класса в объекте производного класса инициализируется с использованием base(void), а поле s инициализируется с использованием string::string(void):

class base

{

public:

base( void ); // конструктор по умолчанию

base( const base ?r ); // конструктор копии

const base ?operator=( const base ?r );

};

class derived

{

string s; // класс имеет конструктор копииpublic: derived( const derived ?r )};

derived::derived( const derived ?r )

{}

Чтобы гарантировать копирование также поля string и компонента базового класса в объекте производного класса, используйте следующее: derived::derived( const derived ?r ) : base(r), s(r.s) {}