If you are lucky, you will be able to directly identify concepts in your requirements which fall into a natural inheritance hierarchy. Requirements which mention phrases like "X is a Y" / "X is a kind of Y" / "X is a type of Y" are likely candidates for inheritance.
Often, though, you may only discover an inheritance hierarchy during implementation, and you should refactor accordingly. Tell-tale signs include:
- one or more methods whose behavior differs depending on the "type" of the entity instance;
- a need to link each row on a database table (A) to exactly one of either:
- a row on table B; or
- a row on table C (but not both);
- a need to pass around lists of entity instances, which may be made up of instances of entities of more than one type.
It is often a good idea to look out for refactoring opportunities during implementation to take advantage of appropriate object-oriented design techniques.