Урок 155. Порядок построения дочерних классов

  Юрий Ворон  | 

    | 

  Обновлено 11 Авг 2018  | 

 1156

 ǀ   2 

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

Во-первых, вот несколько новых классов, которые будут помогать нам иллюстрировать важные моменты:

В этом примере класс Child является дочерним классу Parent:

Поскольку Child наследует переменные-члены и методы класса Parent, то вы можете предположить, что члены класса Parent копируются в класс Child. Но это не так. Вместо этого рассматривайте Child как класс, который состоит из двух частей: первая – Parent, вторая — Child:

Вы уже видели множество примеров того, что происходит при создании объектов обычного (не дочернего) класса:

Parent — это не производный класс, так как он не наследует свойства каких-либо других классов. C++ выделяет память для Parent, затем вызывается конструктор по умолчанию класса Parent для выполнения инициализации.

Теперь рассмотрим, что происходит при создании объектов производного класса:

На первый взгляд всё вроде бы также, как и в предыдущем примере, но под капотом всё несколько иначе. Как мы уже говорили, класс Child состоит из двух частей: часть Parent и часть Child. Когда C++ создает объекты дочерних классов, то он делает это поэтапно. Сначала создается самый верхний класс иерархии (тот, что родитель). Затем создается дочерний класс, который идет следующим по порядку и так до тех пор, пока не будет создан последний класс (тот, что находится в самом низу иерархии).

Поэтому, при создании объекта класса Child, сначала создается часть Parent класса Child (с использованием конструктора по умолчанию класса Parent) и после того, как с частью Parent покончено, создается вторая часть Child (с использованием конструктора по умолчанию класса Child). В нашем примере больше нет дочерних классов, поэтому на этом всё и заканчивается.

Этот процесс на самом деле легко проиллюстрировать:

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



Instantiating Parent:
Parent
Instantiating Child:
Parent
Child

Как вы можете видеть, при создании Child, сначала создается часть Parent класса Child. В этом есть смысл, так как по логике вещей ребенок не может существовать без родителя. Это также способствует безопасности и эффективности выполнения кода: дочерний класс часто использует переменные-члены и методы родителя, но родительский класс ничего не знает о своем дочернем классе. Первоначальная инициализация родительского класса гарантирует, что его переменные-члены и методы будут проинициализированы до момента использования их дочерним классом.

Порядок построения классов в цепочке наследования

Часто бывает ситуация, когда классы наследуют свойства других классов, которые в свою очередь наследуют свойства еще других классов. Например:

Помните, что в C++ всегда идет построение с «первого» или «топового» класса иерархии. Затем C++ переходит к следующему классу в иерархии и выполняет его построение. Этот процесс последовательный.

Проиллюстрируем порядок построения классов в цепочке наследования выше:

Результат:

Constructing A:
A
Constructing B:
A
B
Constructing C:
A
B
C
Constructing D:
A
B
C
D

Итого

C++ выполняет построение дочерних классов поэтапно, начиная с топового класса иерархии и заканчивая нижним классом иерархии. По мере построения каждого класса для выполнения инициализации вызывается соответствующий конструктор соответствующего класса.

В следующем уроке мы рассмотрим роль конструкторов в процессе построения дочерних классов.

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

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (14 оценок, среднее: 5,00 из 5)
Загрузка...

Комментариев: 2

  1. Ilya:

    Хей, хочу спросить. Как ты переводишь данные уроки ? То есть с помощью переводчика или прям по-своему, по-особому (например вдалбливал каждое слово в словарь и запоминал). Я имею ввиду именно словарный запас, где ты его набирал и как, ведь это технический инглиш получается.

    1. Юрий Юрий:

      Привет. Сам перевод у меня состоит из трех этапов. Первый — это с помощью Переводчика, затем адаптация к русскому языку, его правилам. И затем уже финальная вычитка/редактура. Но огромную помощь действительно оказывает Переводчик — экономит время. Но бывает, что и переписываю абзацы с нуля. А технический English — то я учусь на программиста, поэтому эта тема знакома + Гугл в помощь.

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

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

ВОЛШЕБНАЯ ТАБЛЕТКА ПО С++