There are two sides to this question. One, what rules of C++ does this design violate? And two, why does C++ have such rules?
The first one is easy. You can override a function by a function with exactly the same argument list. Since (const IClient& anotherClient) is not exactly the same as (const SeviceClient& anotherClient), no override takes place. Case closed.
The second one is a bit more involved. To understand it, let's use a more familiar class hierarchy. There is class Animal, and there is class Dog : public Animal, and class Cat : public Animal.
What bool Animal::operator==(const Animal&) tells us? It tells us that we can compare an animal with another animal. In particular, we can compare a dog with a dog, and a cat with a cat, bit also a dog with a cat, and a rat with a bat, and a fish with a moskito, and an aardvark with a T. Rex. It is a promise that class Animal makes yo us. If we have two Animal object, we can compare them.
Now, a function that overrides this operator is supposed to fulfill the promise. Does bool Dog::operator==(const Dog&) does that? No, it fulfills a much narrower promise: that this Animal (that happens to be a Dog) can be compared with a Dog. Is it lawful to fulfill this narrow promise? Absolutely. Is it lawful to pretend that this function also fulfills the wide promise, that of being able to compare any two animals? Absolutely not. So we can declare this function, but cannot claim that it overrides the Animal equality operator.
What would happen if there was a rule that would allow us to claim that?
Dog d;
Cat c;
Animal& da = d;
Animal& ca = c;
std::cout << (da == ca);
This program fragment would have to compile, since every line is valid (under our fantasy rule), but what should it do? There is no code that compares a dog with a cat!
Some languages say "OK, no big deal, we'll just throw a run-time error". C++ doesn't do that. If you want the code above to throw a run-time error, you should write code that throws a run-time error yourself. This means overriding bool Animal::operator==(const Animal&) with bool Dog::operator==(const Animal&) and bool Cat::operator==(const Animal&), and checking for the error condition there.
It is probably not a good idea though. Equality usually makes little sense for class hierarchies. It is usually a much better idea to either omit the comparison altogether, or make it non-virtual and defined in child classes only.