Чтобы повторить сказанное Навином, operator=()
, определенный в CSpecial, не совместим с тем, который определен в ICommon, и приводит к перегрузке, а не к переопределению. Хотя у вас могут быть ковариантные типы возвращаемых данных (как и у вас), сами аргументы не могут быть ковариантными.
Кроме того, вы определили ICommon::operator=()
как const, что кажется нелогичным. В производном классе вы сделали его неконстантным (как и ожидалось), но, опять же, это делает сигнатуры функций еще более несовместимыми.
Идея Навина clone()
, вероятно, является лучшим выбором. В противном случае, вы можете передать константную ссылку ICommon на ваш CSpecial operator=()
и попробовать немного магии dynamic_cast<>()
, но это пахнет забавно.
Удачи!