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