Конструкторы копий должны использовать списки инициализации членов
У наследования тоже есть свои проблемы с копированием. Конструктор копии все же остается конструктором, поэтому здесь также применимы результаты обсуждения предыдущего правила. Если у конструктора копии нет списка инициализации членов, то для базовых классов и вложенных объектов используется конструктор по умолчанию. Так как список инициализации членов отсутствует в следующем определении конструктора копии, то компонент базового класса в объекте производного класса инициализируется с использованием 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) {}