Оператор присваивания базового класса, не названный

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

Описание

Оператор присваивания базового класса, не названный, происходит, когда оператор присваивания копии производного класса не вызывает оператор присваивания копии своего базового класса.

Риск

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

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

Фиксация

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

Даже если элементами данных базового класса не является 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++
Значение по умолчанию: на
Синтаксис командной строки: MISSING_BASE_ASSIGN_OP_CALL
Влияние: высоко

Введенный в R2015b