Оператор присваивания должен быть реализован нестатической функцией-членом с ровно одним параметром. Поскольку оператор присваивания копии operator= неявно объявляется для класса, если он не объявлен пользователем ([class.copy]), оператор присваивания базового класса всегда скрывается оператором присваивания копии производного класса.
Любой оператор присваивания, даже операторы присваивания копирования и перемещения, могут быть виртуальными. [ Note: Для производного класса D с базовым классом, B для которого было объявлено виртуальное назначение копирования / перемещения, оператор назначения копирования / перемещения в D не отменяет Bвиртуальный оператор назначения копирования / перемещения. [ Example:
struct B { virtual int operator= (int); virtual B& operator= (const B&); }; struct D : B { virtual int operator= (int); virtual D& operator= (const B&); }; D dobj1; D dobj2; B* bptr = &dobj1; void f() { bptr->operator=(99); // calls D::operator=(int) *bptr = 99; // ditto bptr->operator=(dobj2); // calls D::operator=(const B&) *bptr = dobj2; // ditto dobj1 = dobj2; // calls implicitly-declared D::operator=(const D&) }
— end example ] ] — end note