Как указывает sepp2k, есть несколько представлений, объясняющих это в другом посте.Вот мои два цента об этом.Мне нравится смотреть на это так
Если для каждого объекта o1 типа TallPerson существует объект o2 типа Person, такой, что для всех программ P, определенных в терминах Person, поведение P остается неизменным, когда o1заменяется на o2, тогда TallPerson является подтипом Person.(замена S на TallPerson и T на Person)
Как правило, у нас есть объекты, у которых некоторый базовый класс обладает большей функциональностью, поскольку он расширен.Однако с большей функциональностью мы специализируемся на этом и сокращаем область, в которой они могут использоваться, таким образом становясь подтипами своего базового класса (более широкий тип).