The Visitor pattern uses inheritance in a rigorously controlled way to implement a glorified switch() statement. The underlying issue with implementation inheritance is that it does not have sensible semantics in the general case: it introduces all sorts of long-range and unpredictable couplings (failures of modularity) between a base object and its future "derived" versions. Pure interface inheritance does not have this issue, because it inherently decouples the interface from its implementations.