class Penguin : Bird{
override void Fly(){
throw new InvalidOperationException("can't fly");
}
}
This is breaking the Liskov Substitution Principle[1]. By saying that Penguin is a subclass of Bird, you're implying that I should be able to stick a Penguin into any code that expects a Bird, that code will just work, without it having to care about the particularity of that Bird actually being a Penguin.
[1] http://en.wikipedia.org/wiki/Liskov_substitution_principle
[edit: grammar]
Overall agreed, though. This ties into timr's point that if there are errors in your classifications, then your class hierarchy is incorrect.