Введенные данные никак не проверяются. В случае выхода за допустимые рамки нет никакой реакции. По хорошему это должно быть реализовано через сеттеры. Много лишнего.
Пожалуйста имейте ввиду, что этот пользователь забанен
Главное правило: не всегда Компактность == хорошо. Код должен быть в первую очередь читабельным, для людей. Тут конечно можно все понять, не трудно догадаться, но если бы это были более комплексные задачи, то можно было бы и глаза и голову сломать человеку, который этот код не писал. Скорее всего ваш учитель пытается донести до вас это правило для работы в команде. Да и вообще, думай всегда наперед, пиши код так, чтобы ты через 2 года мог на него взглянуть и понять все, что ты написал. Это значит: Понятная структура, хорошая читаемость, комментарии "К КАЖДОЙ" Функции, желательно даже с примерами по типу black box unit testinga. Я так же делала такие ошибки, пока не пришлось через какое-то время вернуться в ужасе к этой писанине. А теперь представь, возвращаешься не ты, а твой коллега?
Сугубо имхо и по куску - Car должен быть отвязан от прямого ввода через cin и вывода через cout в своих методах. Представьте себе что car вообще может использоваться не в консольном приложении- и? только из-за этого пеперисывать код базовых классов? А если ещё и наследования.... if (x==1) и т. д. есть switch, есть else, можно функцию написать чтобы запрашивать данные с приглашением ввода и проверкой и её использовать. Хотя-бы так. Если видите практически повторяющиеся куски кода - наверное стоит подумать как этого избежать... И не уверен, что Вы правильно сделали, что взялись за ООП, не освоив базовые вещи.