По сути, вы выделяете общие функциональные возможности из набора созданных вами классов и помещаете эти функциональные возможности в базовый класс. Затем, когда каждый класс наследует от базового класса, они получают эту функциональность (или могут переопределить ее и предоставить собственную реализацию). Код, обеспечивающий функциональность, остается в базовом классе, в одном месте, а не в вашем наборе классов.
Вот хорошая дискуссия об этом, а также о том, как вписывается полиморфизм. Есть много хороших книг на эту тему.