Урок 154. Базовое наследование в C++

   ⁄ 

 Обновлено 6 Авг 2018  ⁄ 

⁄   328

Теперь, когда мы уже говорили о наследовании в абстрактном смысле, давайте поговорим о том, как это используется в C++ на практике.

Наследование в C++ происходит между классами. Тип отношений у наследований – «является». Класс, от которого наследуют, называется родительским, базовым или суперклассом, а класс, который наследует, называется дочерним, производным или подклассом.

В диаграмме выше Фрукт является родительским классом, а Яблоко и Банан – дочерними.

В этой же диаграмме Треугольник — это и дочерний класс (родитель — Фигура), и родительский (для Правильного треугольника) одновременно.



Дочерний класс наследует как поведение (методы), так и свойства (переменные-члены) от родителя (с учетом некоторых ограничений доступа, которые мы рассмотрим в следующем уроке). Эти методы и переменные становятся членами дочернего класса.

Поскольку дочерние классы являются полноценными классами, то они могут (конечно) иметь и свои собственные члены. Сейчас мы это всё рассмотрим подробнее.

Класс Human

Вот простой класс Human для представления Человека:

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

Обратите внимание, в примере выше мы сделали все переменные-члены и методы класса открытыми. Это сделано ради простоты примера. Обычно переменные-члены нужно делать private. О средствах контроля доступа и о том, как это работает в наследовании, мы поговорим в следующих уроках этой главы.

Класс BasketballPlayer

Предположим, нам нужно написать программу, которая будет отслеживать информацию о баскетболистах. Мы можем сохранять средний уровень игры баскетболиста и количество забитых очков.

Вот наш незавершенный класс BasketballPlayer:

Также нам нужно знать имя и возраст баскетболиста, а эта информация уже у нас есть — хранится она в классе Human.

У нас есть три варианта добавления имени и возраста в BasketballPlayer:

  Добавить имя и возраст в класс BasketballPlayer непосредственно в качестве членов. Это худший вариант, так как произойдет дублирование кода, который уже существует в классе Human. Любые обновления в Human также должны быть продублированы и в BasketballPlayer.

  Добавить класс Human в качестве члена в класс BasketballPlayer, используя композицию. Но следует вопрос: «Может ли BasketballPlayer иметь Human»? Нет, это некорректно.

  Сделать, чтобы BasketballPlayer наследовал необходимые атрибуты от Human. Помните, что тип отношений наследований – «является». Является ли BasketballPlayer Human-ом (т.е. Человеком)? Конечно! Поэтому наш выбор – наследование.

Делаем класс BasketballPlayer дочерним

Чтобы класс BasketballPlayer наследовал информацию от класса Human, нам нужно после объявления BasketballPlayer (class BasketballPlayer) использовать двоеточие, ключевое слово «public» и имя класса, от которого мы хотим наследовать. Это называется открытым наследованием.

Проиллюстрируем:

Когда BasketballPlayer наследует свойства класса Human, то BasketballPlayer приобретает методы и переменные-члены класса Human. Кроме того, BasketballPlayer имеет еще два своих собственных члена: m_gameAverage и m_points. Здесь есть смысл, так как эти свойства специфичны только для BasketballPlayer, а не для каждого Human-а.

Таким образом, объекты BasketballPlayer будут иметь 4 члена:

  m_ gameAverage и m_ points от BasketballPlayer;

  m_name и m_age от Human.

Полный код программы:

Результат выполнения программы выше:

Anton

Это работает, так как anton является объектом класса BasketballPlayer, а все объекты BasketballPlayer имеют переменную-член m_name и метод getName(), унаследованные от класса Human.

Дочерний класс Employee

Теперь напишем еще один класс, который также будет наследовать свойства Human. Например, класс Employee (Работник). Работник «является» Человеком, поэтому использование наследования здесь является корректным:

Работник наследует m_name и m_age от Human (а также два метода) и имеет еще две собственные переменные-члены и один метод. Обратите внимание, метод printNameAndWage() использует переменные как из класса, к которому принадлежит (Employee::m_wage), так и с родительского класса (Human::m_name).



Проиллюстрируем:

Обратите внимание, Employee и BasketballPlayer не имеют прямых отношений, хотя оба наследуют свойства класса Human.

Вот полный код:

Результат:

Ivan: 350

Цепочка наследований

Можно наследовать от класса, который сам наследует от другого класса. При этом ничего примечательного или особого не происходит — всё аналогично тому, что мы рассмотрели выше.

Например, напишем класс Supervisor. Супервайзер — это Работник, который является Человеком. Мы уже написали класс Employee, поэтому будем его использовать как родительский класс:

Смотрим:

Все объекты Supervisor наследуют методы и переменные от Employee и Human, а также имеют свою собственную переменную-член m_nOverseesID.

Построив такие цепочки наследований, мы можем создать набор повторно используемых классов, которые будут иметь общие свойства вверху и становится всё более специфичными на каждом следующем уровне наследования.

Почему наследование является полезным?

Использование наследования означает, что нам не нужно переопределять информацию из родительских классов в дочерних. Мы автоматически получаем методы и переменные-члены суперкласса через наследование, а затем просто добавляем специфичные методы или переменные-члены, которые хотим. Это не только экономит время и усилия, но также является очень эффективным: если мы когда-либо обновим или изменим базовый класс (например, добавим новые функции или исправим ошибку), все наши производные классы автоматически будут наследовать эти изменения!

Например, если мы добавим новый метод в Human, то Employee и Supervisor автоматически получат доступ к нему. Если мы добавим новую переменную в Employee, Supervisor также получит доступ к ней. Это позволяет создавать новые классы более простым, интуитивно-понятным способом!

Итого

Наследование позволяет повторно использовать классы путем наследования членов этих классов другими классами. В следующих уроках мы будем разбираться детальнее, как это всё работает.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (10 оценок, среднее: 5,00 из 5)
Загрузка...
Подписаться на обновления:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

ПОДПИСЫВАЙТЕСЬ

НА КАНАЛ RAVESLI В TELEGRAM

@ravesli

ПОДПИСАТЬСЯ БЕСПЛАТНО