Определяемый пользователем оператор назначения не должен быть виртуальным
Определяемый пользователем оператор назначения не должен быть виртуальным.
Определение оператора назначения как virtual в базовом классе указывает, что вы хотите переопределить его в производных классах. Переопределение оператора назначения в производных классах может привести к неопределенному поведению и ошибкам времени выполнения. Рассмотрим этот фрагмент кода, где оператор виртуального назначения переопределен в двух производных классах.
class Base {public:
virtual Base& operator=(Base const& oth) = 0;
//...
};
class Derived public: Base{ public:
Derived& operator=(Base const& oth) override{/*...*/}
//...
};
class Derived2 public: Base{public:
Derived2& operator=(Base const& oth) override{/*...*/}
//...
};
main(){
Derived d1;
Derived2 d2;
d1 = d2;
}Derived::operator= и Derived2::operator= переопределяет Base::operator=их списки параметров должны быть идентичными.
Derived::operator= принимает ссылку на Base объект как вход и возвращает ссылку на Derived.
Derived2::operator= принимает ссылку на Base объект как вход и возвращает ссылку на Derived2.
The Derived::operator= принимает ссылки на оба Base и Derived объекты класса, поскольку ссылки на производные классы совместимы с их базовыми классами. Точно так же Derived2::operator= также принимает ссылки на оба Base и Derived2 объекты класса. Назначение Derived объект в Derived2 объект в d1=d2 не приводит к ошибке компиляции. Объекты d1 и d2 не связаны. Назначение, копирование или перемещение операций между такими несвязанными объектами не определены и могут привести к ошибкам времени выполнения.
Чтобы избежать неопределенного поведения и ошибок времени выполнения, сохраните определяемые пользователем операторы назначения как невирусные. Это правило применимо к следующим операторам:
Назначение
Копирование и перемещение назначения
Все составные назначения
Polyspace® помечает объявление всех операторов виртуального назначения в базовом классе.
Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
| Группа: Производные классы |
| Категория: Необходимый, Автоматизированный |