Правила программирования на С и С++. Главы 7-8 - Конструкторы копий должны использовать списки инициализации членов
ОГЛАВЛЕНИЕ
Страница 43 из 74
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) {}