exponenta event banner

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

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

Описание

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

Риск

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

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

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

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

Даже если элементы данных базового класса не являются 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 не вызывается.

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

  • Чтобы найти определение производного класса, щелкните правой кнопкой мыши имя производного класса и выберите «Перейти к определению».

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

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

Исправление - Оператор копирования класса базы вызовов

Если требуется, чтобы оператор присвоения копирования выполнил полное присвоение, одной из возможных корректировок является вызов оператора присвоения копирования класса. 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