Определяемый пользователем оператор назначения не должен быть виртуальным
Определяемый пользователем оператор назначения не должен быть виртуальным.
Определение оператора назначения как 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® помечает объявление всех операторов виртуального назначения в базовом классе.
Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
Группа: Производные классы |
Категория: Необходимый, Автоматизированный |