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