Пользовательский оператор присваивания не должен быть виртуальным
Пользовательский оператор присваивания не должен быть виртуальным.
Определение оператора присваивания как 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
.
Derived::operator=
принимает ссылки на оба Base
и Derived
объекты класса, потому что ссылки на производные классы совместимы с типом со своими базовыми классами. Точно так же Derived2::operator=
также принимает ссылки на оба Base
и Derived2
объекты класса. Присвоение Derived
возразите против Derived2
объект в d1=d2
не производит ошибки компиляции. Объекты d1
и d2
не связаны. Присвоение, копируя, или движущиеся операции между такими несвязанными объектами не определено и может привести к ошибкам времени выполнения.
Чтобы избежать неопределенного поведения и ошибок времени выполнения, сохраните пользовательские операторы присваивания как невиртуальные. Это правило применяется к этим операторам:
“()” Присвоение
Скопируйте и переместите присвоение
Все составное присвоение
Polyspace® отмечает объявление любых виртуальных операторов присваивания в базовом классе.
Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.
Группа: Производные классы |
Категория: необходимый, автоматизированный |