To repeat what Naven said, operator=() defined in CSpecial is incompatible with that defined in ICommon and leads to overloading rather than overriding. Although you can have covariant return types (as you did), the arguments themselves cannot be covariant.
Also, you defined ICommon::operator=() as const, which seems inconsistent. In a derived class, you made it non-constant (as expected), but again, this makes the function signatures more incompatible.
The idea of ββNaveen clone() is probably your best bet. Otherwise, you can pass the ICommon const link to your CSpecial operator=() and try some dynamic_cast<>() magic inside, but it smells funny.
Good luck
source share