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++
Значение по умолчанию: на
Синтаксис командной строки: MISSING_BASE_ASSIGN_OP_CALL
Удар: высоко

Введенный в R2015b