Абстрактные классы используются для моделирования общего «мастер-класса», который никогда не будет использоваться сам по себе, но его производные классы будут использовать эти данные / функции.
Например, скажем, ваше наследство
Animal
Bird Mammal Reptile
В вашей игре вы когда-либо будете использовать только Птицу / Млекопитающее / Рептилию, поскольку это конкретные модели животных, но все они будут иметь хотя бы некоторое общее количество кода. Health, Hunger и может предоставлять некоторые абстрактные функции, такие как Move (), которые будут реализованы на уровне подкласса.
С инженерной точки зрения, это позволяет вам делать причудливые вещи, такие как создание массива / вектора типа Animal, который может содержать птиц, млекопитающих и рептилий.
Допустим, у нас есть вектор типа Animal с 1 из каждого подкласса.
Тогда мы можем сделать
foreach (Animal a in animals)
a.Move(100)
Птицы / Млекопитающие / Рептилии движутся по-разному, но поскольку у нас есть эта абстрактная функция без реализации на базовом уровне, наш код может гарантировать, что в какой-то момент в дереве наследования она будет реализована.
Другими популярными примерами являются абстрактный класс Item и абстрактная функция item.Use (); Предметом может быть зелье, свиток, яблоко (класс Еда). Это не имеет значения, потому что все они используют один и тот же интерфейс базового уровня.