C++ 8. Наследование, видимость и доступность при наследовании.

YOUTUBE · 01.12.2025 04:33

Ключевые темы и таймкоды

Введение в тему наследования

0:04
  • Переход к следующей теме, которая называется "Наследование".
  • Тема будет состоять из шести или семи пунктов.
  • Создание нового файла для работы с темой.

Основные принципы программирования

1:16
  • Три основных принципа программирования: инкапсуляция, наследование и полиморфизм.
  • Обсуждение инкапсуляции, теперь переходим к наследованию.

Идея наследования

1:44
  • Наследование позволяет создавать типы, которые являются подтипами других типов.
  • Можно построить иерархию типов, где один тип обладает всеми свойствами другого типа и дополнительными свойствами.
  • Наследование поддерживается многими объектно-ориентированными языками, включая C++, Java, Python и другие.

Публичное, приватное и защищенное наследование

3:22
  • Пункт 4.1 будет посвящен публичному, приватному и защищенному наследованию.

Введение в наследование

3:40
  • Базовый класс Base и производный класс Derive.
  • Базовый класс содержит поле и функцию.
  • Функция выводит слово "Base".

Публичное наследование

4:32
  • Объявление класса Derive с использованием двоеточия.
  • Варианты наследования: public, private, protected.
  • Публичное наследование позволяет использовать все методы и поля базового класса.

Пример использования публичного наследования

5:15
  • Объявление полей и методов в Derive.
  • Создание объекта Derive и вызов методов базового класса.
  • Проверка доступа к полям базового класса.

Различие между public и private

7:11
  • Public наследование делает класс Derive публичным случаем базового класса.
  • Private наследование делает класс Derive приватным случаем базового класса.
  • Доступ к приватным полям возможен только из тела класса или через друзей.

Доступ к приватным полям

10:16
  • Приватные поля доступны только членам класса и друзьям.
  • Объявление функции как друга класса позволяет обращаться к приватным полям.
  • Приватность на уровне класса, а не базового класса.

Protected наследование

15:03
  • Protected наследование делает поля доступными для методов и друзей класса, а также для наследников.
  • Protected поля доступны только через методы и друзей класса.
  • Protected поля не доступны из основного класса.

Пример использования protected

17:01
  • Объявление поля как protected в базовом классе.
  • Доступ к protected полю из класса Derive.
  • Доступ к protected полю из основного класса возможен через друзей.

Дружба и наследование

20:24
  • Обсуждение дружбы и её роли в наследовании.
  • Дружба помогает при обращении к полям и методам родителя.
  • Рекомендация использовать дружбу редко, только для понимания теории.

Виды наследования

21:47
  • Наследование бывает правило, паблик и протектор.
  • Протектор наследования позволяет только друзьям и наследникам обращаться к базовым полям.
  • Пример с методом, который выводит поле родителя.

Правила доступа

23:56
  • Доступ к полям и методам определяется по минимальному уровню доступа.
  • Если на любом этапе доступа отказано, доступ к полю или методу невозможен.
  • Пример с иерархией наследования и доступом к полям.

Публичные и защищенные поля

27:15
  • Публичные поля доступны всем, защищенные - только друзьям и наследникам.
  • Пример с функцией, принимающей объект типа бейс.
  • Доступ к защищенным полям возможен только для объектов типа бейс.

Компилятор и доступ

29:15
  • Разграничение доступа проверяется компилятором.
  • В Python нет концепции правила и паблик, так как нет компилятора.
  • В C++ это механизм защиты от случайного доступа к защищенным полям.

Тест и видимость

32:55
  • Следующий пункт лекции - тест видимости и доступности.
  • Отличие наследования классов от структур: у структур по умолчанию публичное, у классов - приватное.
  • Наследование у классов приватное по умолчанию, у структур - публичное.

Видимость и доступность

34:16
  • Видимость и доступность - разные концепции.
  • Переменная может быть невидимой, но доступной.
  • Пример с бабушкой, мамой и сыном для демонстрации.

Переопределение методов

35:14
  • Объявление полей и методов с одинаковыми именами.
  • Переопределение метода в дочернем классе.
  • Предпочтение более локального метода.

Явное использование версии из предка

37:44
  • Возможность явного использования версии из предка.
  • Пример с сыном и мамой.
  • Явное указание на использование версии из мамы.

Видимость и доступность полей

39:42
  • Поле в сыне затмевает поле в маме.
  • Возможность обращения к полю в сыне.
  • Проверка доступности после выбора версии.

Проверка доступности

41:32
  • Проверка доступности после выбора версии.
  • Пример с полем и методом.
  • Видимость и доступность как отдельные шаги.

Перегрузка и выбор версии

44:52
  • Пример с функцией от инт и дабл.
  • Компилятор выбирает версию до разрешения перегрузки.
  • Версия в сыне затмевает версию в маме.

Заключение

47:21
  • Версия в сыне делает версию в маме невидимой.
  • Пример с функцией от стд стринг.
  • Версия в сыне выигрывает перегрузку.

Образование страдательных причастий

47:30
  • Обсуждение образования страдательных причастий от слова "затмить".
  • Пример с использованием "дабл" и "эф".
  • Объяснение, почему "дабл" не подходит для образования страдательных причастий.

Использование "юзинг"

48:13
  • Объяснение, как "юзинг" добавляет в область видимости все версии функций из родительского класса.
  • Пример использования "юзинг" для выбора правильной версии функции.
  • Демонстрация, как "юзинг" позволяет участвовать в перегрузке функциям из родительского класса.

Проверка доступности функций

50:01
  • Объяснение, что приватные функции не могут быть использованы через "юзинг".
  • Пример, почему "юзинг" не работает с приватными функциями.
  • Уточнение, что "юзинг" делает функции доступными извне, но не меняет их приватность.

Синтаксические ошибки при использовании "юзинг"

52:11
  • Объяснение, что нельзя писать "юзинг тип" в классе.
  • Пример, как можно писать "юзинг мам" для доступа к полям.
  • Объяснение, почему конфликт имен возникает при использовании одинаковых имен в разных классах.

Использование "юзинг" конструкторов

54:45
  • Объяснение, что начиная с C++11 можно использовать "юзинг" конструкторов.
  • Пример, как это позволяет создавать объекты типа "сын" от тех же типов, что и родительский класс.
  • Пример использования "юзинг" конструкторов для инициализации полей.

Заключение

56:50
  • Проверка, что все важные моменты были обсуждены.
  • Завершение обсуждения и прощание с аудиторией.