Base class assignment operator not called

Оператор назначения копирования не вызывает операторов назначения копирования базовых подобъектов

Описание

Этот дефект возникает, когда оператор назначения производного класса не вызывает оператор назначения копирования его базового класса.

Риск

Если этот дефект возникает, если вы не инициализируете представители данных базового класса явным образом в производном операторе назначения классов, оператор инициализирует представители неявно с помощью конструктора по умолчанию базового класса. Поэтому возможно, что представителям данных базового класса не будут присвоены правильные значения.

Если пользователи вашего класса ожидают, что оператор назначения выполнит полное назначение между двумя объектами, они могут столкнуться с непреднамеренными последствиями.

Зафиксировать

Вызовите оператор назначения копирования базового класса из оператора назначения производного класса.

Даже если представители данных базового класса не private, и вы явным образом инициализируете представителей данных базового класса в производном операторе назначения копирования классов, замените эту явную инициализацию вызовом оператора назначения копирования базового класса. В противном случае определите, почему вы сохраняете явную инициализацию.

Примеры

расширить все

class Base0 {
public:
    Base0();
    virtual ~Base0();
    Base0& operator=(const Base0&);
private:
    int _i;
};

class Base1 {
public:
    Base1();
    virtual ~Base1();
    Base1& operator=(const Base1&);
private:
    int _i;
};

class Derived: public Base0, Base1 {
public:
    Derived();
    ~Derived();
    Derived& operator=(const Derived& d) {
        if (&d == this) return *this;
        Base0::operator=(d);
        _j = d._j;
        return *this;
    }
private:
    int _j;
};

В этом примере класс Derived определяется из двух классов Base0 и Base1. В операторе присвоения копий Derived, только оператор назначения копии Base0 вызывается. Оператор назначения копий Base1 не вызывается.

Дефект появляется в операторе назначения копии производного класса. Ниже приведены некоторые советы по навигации в исходном коде:

  • Чтобы найти определение производного класса, щелкните правой кнопкой мыши имя производного класса и выберите Go To Definition.

  • Чтобы найти определение базового класса, сначала перейдите к определению производного класса. В определении производного класса щелкните правой кнопкой мыши имя базового класса и выберите Go To Definition.

  • Чтобы найти определение оператора копирования базовых классов, сначала перейдите к определению базовых классов. В определении базового класса щелкните правой кнопкой мыши имя оператора и выберите Go To Definition.

Коррекция - оператор копирования базового класса вызова

Если необходимо, чтобы оператор присвоения копирования выполнил полное присвоение, одной из возможных коррекций является вызов оператора присвоения копирования класса Base1.

class Base0 {
public:
    Base0();
    virtual ~Base0();
    Base0& operator=(const Base0&);
private:
    int _i;
};

class Base1 {
public:
    Base1();
    virtual ~Base1();
    Base1& operator=(const Base1&);
private:
    int _i;
};

class Derived: public Base0, Base1 {
public:
    Derived();
    ~Derived();
    Derived& operator=(const Derived& d) {
        if (&d == this) return *this;
        Base0::operator=(d);
        Base1::operator=(d);
        _j = d._j;
        return *this;
    }
private:
    int _j;
};

Информация о результатах

Группа: Объектно-ориентированная
Язык: C++
По умолчанию: On для рукописного кода, off для сгенерированного кода
Синтаксис командной строки: MISSING_BASE_ASSIGN_OP_CALL
Влияние: Высокий
Введенный в R2015b