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

  Юрий  | 

  |

  Обновл. 15 Сен 2021  | 

 41657

 ǀ   4 

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

Во-первых, вот 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 (240 оценок, среднее: 4,95 из 5)
Загрузка...

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

  1. Fantasy:

    Я как всегда с вопросом, если родительский класс создается первым.  То как насчёт зависимости класа родителя и класса наследника? Например в класе родитель есть конструктор с 1 параметром при этом родитель сугубо виртуальный (т-е этот класс никак нельзя создать (именно обьект класса) ) мы создаем далее дочерний класс и в нем в конструкторе описываем параметр для родителя; И выходит создать родителя мы не можем ибо это виртуальный класс и дочерний создать не можем ибо без переопределения виртуала и без записи параметра для родителя он не будет работать.

  2. Bampi:

    Спасибо за хорошо поданный материал. В примеры, наверное, стоило бы еще деструкторы добавить. Так как, как уже упоминалось в уроках, то могут быть проблемы с динамическими объектами.

  3. Ilya:

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

    1. Фото аватара Юрий:

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

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

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