Если я не понимаю, чего вы хотите достичь, вам нужен оператор присваивания для класса Derived
, то есть тот, который принимает Derived
в качестве ввода:
class Derived : public Base
{
/* ... */
public:
Derived& operator=(const Derived &rhs)
{
cout << "Assignment operator in Derived"<< endl;
return *this;
}
};
Что произошло в вашем коде (уже объяснено в ответе Бо Перссона и комментариях там):
в Derived
вы реализовали оператор присваивания, который принимает экземпляр Base
; но в main()
вы присваиваете экземпляр Derived
; компилятор не видел оператора присваивания для Derived
(тот, который принимает Base
, не считается), и поэтому он сгенерировал оператор, который вызывает Base::operator=()
и затем присваивания для элементов данных Derived
. Если вы определили присвоение, как показано выше, этого не произойдет, и ваш оператор будет вызван; обратите внимание, что в этом случае присвоения Base
и членов данных не будут выполняться автоматически.
Другая ситуация, если вы действительно хотите получить назначение от Base
до Derived
, например использовать его с другими производными Base
. Тогда определенный вами оператор будет работать, но чтобы применить его к экземпляру Derived
, вам нужно привести этот экземпляр к Base
:
Derived d1(10,20);
Derived d2(30,40);
d1 = static_cast<Base&>(d2);
Само собой разумеется, что определенный вами оператор не может легко получить доступ к элементам данных rhs
, специфичным для Derived
: например, чтобы использовать rhs.y
, вам нужно было бы «прекратить» rhs
до Derived
:
Derived& Derived::operator=(const Base& rhs)
{
/* ... */
Derived* rhs_d = dynamic_cast<Derived*>(&rhs);
if( rhs_d )
this->y = rhs_d->y;
}