background top icon
background center wave icon
background filled rhombus icon
background two lines icon
background stroke rhombus icon

Скачать "Углубленное программирование на С С++ Лекция 12"

input logo icon
Теги видео
|

Теги видео

технопарк
техносфера
технотрек
техноатом
технополис
mail.ru
мейл.ру
лекции по программированию
как программировать
уроки программирования
как начать программировать
курсы программирования
веб разработка
мобильная разработка
frontend
backend
фронтенд
бэкенд
c++
java
джава
субд
базы данных
анализ данных
информационный поиск
perl
перл
линукс
linux
data mining
hadoop
технострим
Субтитры
|

Субтитры

subtitles menu arrow
  • enАнглийский
Скачать
00:00:04
идея изоляции элементов
00:00:07
объектно-ориентированных систем не нова
00:00:10
она составляет основу объектного подхода
00:00:14
к разработке таких систем и составляет
00:00:18
самую суть принципа
00:00:20
инкапсуляции в контексте отношений
00:00:25
наследования
00:00:26
которые связывают два или несколько
00:00:29
классов в иерархию наследования идея
00:00:33
изоляции
00:00:34
принимает вид включение в состав
00:00:38
классов защищенных атрибутов и методов
00:00:44
защищенные атрибуты и методы по уровню
00:00:48
доступа к ним занимают промежуточное
00:00:50
положение между открытыми и закрытыми
00:00:56
членами класса открытые члены класса как
00:01:02
мы уже знаем формируют публичный
00:01:06
интерфейс этого класса то есть состав
00:01:10
запросов с которыми можно обращаться к
00:01:14
самому классу и его
00:01:17
экземпляром в то же время закрыты и
00:01:22
члены класса формируют слой реализации
00:01:27
этих запросов
00:01:30
защищенные члены класса не относятся к
00:01:34
его
00:01:35
интерфейсу образует внимание ту часть
00:01:40
реализации которая может повторно
00:01:44
использоваться классами потомками
00:01:47
данного класса в этом и заключается
00:01:52
основное отличие
00:01:54
защищенных членов кваса от закрытых
00:01:58
к защищенным членом класса могут
00:02:02
относиться не только
00:02:04
атрибуты и рядовые методы этого класса
00:02:09
защищенными могут быть и специальные
00:02:12
методы в первую очередь конструкторы
00:02:15
класса
00:02:17
определение конструкторов и операции
00:02:21
функций класса как защищенных имеет
00:02:25
определенный архитектурный смысл
00:02:28
но к закрытым и защищенным конструкторам
00:02:33
и операциям функциям мы с вами вернемся
00:02:36
немного позже использование
00:02:40
наследования ставит перед разработчиком
00:02:43
вопросы которые в принципе не могли
00:02:47
возникнуть при работе с автономными
00:02:49
классами частности одним из таких
00:02:52
вопросов является вопрос о том что будет
00:02:56
с классом потомкам если
00:03:00
определить в его составе члены данных
00:03:03
одними он и соответствующим членом в
00:03:06
базовом классе
00:03:08
такая ситуация может возникнуть как в
00:03:11
отношении методов так и в отношении
00:03:14
атрибутов случае если производный класс
00:03:18
содержит
00:03:19
атрибут одноименной атрибуту базового
00:03:22
класса то оба атрибута присутствует в
00:03:26
составе производного класса для того
00:03:30
чтобы обратиться к атрибуту
00:03:32
определенному непосредственно в
00:03:35
производном классе
00:03:36
никаких специальных усилий предпринимать
00:03:39
не требуется для того же чтобы
00:03:42
обратиться к одноименному ему атрибуту
00:03:45
класса предка необходимо использовать
00:03:48
квалифицированное имя построенные при
00:03:51
помощи бинарной операции
00:03:52
разрешения области видимости которая на
00:03:56
языке си плюс плюс
00:03:57
выглядит и записывается как два твое
00:04:00
точек обратите внимание что
00:04:03
использование одноименных атрибутов
00:04:07
является нежелательной техникой
00:04:10
программирования но иногда особенно в
00:04:13
ситуациях множественного наследования
00:04:15
она является неизбежным злом заметим что
00:04:22
память при размещении соответствующих
00:04:25
атрибутов внутри экземпляра
00:04:28
класса выделяется для обоих атрибутов и
00:04:31
если это является нежелательным
00:04:34
поведением или нежелательной реализацией
00:04:38
данного аспекта объектной модели то
00:04:42
внедрение в производный класс нового
00:04:45
атрибута желательно пересмотреть как
00:04:48
неудачное решение что же касается
00:04:52
одноименных методов класса определенных
00:04:56
на разных уровнях иерархии наследований
00:04:59
то здесь желаемым поведением возможно
00:05:03
является перегрузка методами
00:05:06
определенными в производном классе
00:05:08
методов определенных базовом классе
00:05:11
без специальных усилий такая перегрузка
00:05:15
невозможно поскольку поведение
00:05:19
класса потомка или точнее
00:05:22
интерпретация компилятором нашей записи
00:05:27
нашего определения класса потомка
00:05:30
состоит в перекрытии методами классов
00:05:35
потомков одноименных им методов классов
00:05:39
предков для того же чтобы перевести
00:05:44
ситуацию перекрытия ситуацию перегрузки
00:05:47
методов необходимо использовать
00:05:50
синтаксическую конструкцию use
00:05:53
рассмотрим небольшой пример пусть в
00:05:57
нашем распоряжении два класса класс
00:06:01
банковский счет и класс накопительный
00:06:05
счет или счет депозит как вы видите из
00:06:11
примера приведенного на текущем слайде
00:06:14
класс счет общего вида может
00:06:18
визуализировать свое содержимое двумя
00:06:21
способами по формату заданному виде
00:06:25
строки в классическом стиле
00:06:28
из-за кассе и согласно некоторым у
00:06:31
режиму визуализации который по умолчанию
00:06:35
принимает значения 0 класс депозит в
00:06:39
свою очень
00:06:41
добавляет к этим возможностям
00:06:43
возможность визуализации по формату
00:06:47
заданному как экземпляр класса std
00:06:50
string
00:06:52
для того чтобы эта возможность
00:06:55
визуализации не перекрывала
00:06:57
две предыдущие состав определение класса
00:07:01
депозита мы вводим определение
00:07:04
use следующего вида заметим что
00:07:14
управлять избирательным включением
00:07:18
состав класса депозита
00:07:19
вариантов визуализации класса общего
00:07:22
вида мы не можем все способы
00:07:27
визуализации счета становятся доступными
00:07:31
в депозите
00:07:33
одновременно еще один вопрос значимость
00:07:38
которого неимоверно возрастает в
00:07:41
контексте наследование
00:07:42
это вопрос о порядке вызова
00:07:46
конструкторов класса каждый класс
00:07:51
конструируется путем вызова
00:07:54
одного основного конструктора для самого
00:07:58
объекта из и еще нескольких
00:08:03
дополнительные конструкторы возникают в
00:08:06
связи с тем что атрибуты этого класса
00:08:08
сами могут являться
00:08:10
экземплярами соответствующих классов
00:08:13
наконец если рассматриваемый класс
00:08:16
участвует в иерархии наследований а то у
00:08:20
него есть базовые классы которые также
00:08:23
имеют своем составе конструкторы порядок
00:08:28
вызова конструкторов класса в языке си
00:08:32
плюс плюс
00:08:33
относится к немногочисленной категории
00:08:36
фактов которые имеют характер строгих
00:08:40
гарантий языка
00:08:41
иными словами их невозможно изменить
00:08:45
а компилятор невозможно обыграть
00:08:49
на его территории например меняя по
00:08:52
я даг элементов указанных в списке
00:08:56
инициализации конструктора класса
00:08:59
порядок который вы видите на нашем
00:09:03
слайде более чем логичен выбор в пользу
00:09:07
именно такого порядка вызова
00:09:11
конструкторов обусловлен следующем любой
00:09:15
конструктор как специальный метод класса
00:09:18
призван подготовить или как мы с вами
00:09:22
уже говорили
00:09:23
отформатировать надлежащим образом ту
00:09:26
область оперативной памяти которая
00:09:29
выделяется для хранения соответствующего
00:09:31
экземпляра с другой стороны каждый
00:09:35
конструктор как специальный метод да и
00:09:39
метод вообще имеет свою зону
00:09:41
ответственности логично что зоной
00:09:46
ответственности по форматированию
00:09:48
участков памяти четко распределены между
00:09:52
базовым и производным классом
00:09:55
производный класс
00:09:57
не пытается отформатировать ту область
00:10:00
памяти в которой будет храниться под
00:10:03
объект базового класса а базовый класс
00:10:05
просто ничего не знает о существовании
00:10:09
производным наконец конструкторы которые
00:10:14
вызываются для подготовки участков
00:10:17
памяти под соответствующими атрибутами
00:10:20
должны сделать свою работу раньше чем
00:10:25
будет вызвана основное тело конструктора
00:10:28
для экземпляра
00:10:30
рис конструктор для экземпляра лишь а
00:10:33
точнее его тело
00:10:35
выполняет финальную работу которую не
00:10:39
смогли по тем или иным причинам
00:10:41
выполнить конструктор под объекта
00:10:44
базового класса или нескольких таких
00:10:47
базовых классов
00:10:49
а также конструкторы атрибутов из этих
00:10:53
соображений вытекают основные правила
00:10:57
программирования конструктора прежде
00:11:00
всего
00:11:01
объем конструктора
00:11:04
точнее той его части которая заключена
00:11:08
фигурные скобки и является телом должен
00:11:11
оставаться на минимально возможном
00:11:14
уровне
00:11:16
кроме того элементы в составе списка
00:11:20
инициализации могут упоминаться в любом
00:11:23
порядке
00:11:24
однако при составлении этого списка
00:11:28
необходимо учитывать в каком порядке
00:11:31
были перечислены базовые классы
00:11:34
а в каком упомянутые атрибуты данного
00:11:39
класса в его определении
00:11:42
рассмотрим пример пусть в нашем
00:11:46
распоряжении имеется определение двух
00:11:49
классов класса альфа и класса бета
00:11:54
который является прямым открытым
00:11:58
наследником класса а
00:12:06
как вы видите в составе определение
00:12:09
класса
00:12:10
бета введены два конструктора в первом
00:12:15
из них список
00:12:17
инициализации не содержит выражение
00:12:21
соответствующего явному вызову
00:12:23
какого-либо конструктора класса альфа
00:12:27
однако это не означает того что ни один
00:12:30
конструктор класса ав а не будет вызван
00:12:33
и соответственно не означает того что
00:12:37
под объект составе экземпляров это
00:12:40
соответствующий экземпляру альфа не
00:12:42
будет должным образом сформирован в
00:12:46
отсутствии явных
00:12:48
обращений к тому или иному конструктору
00:12:50
класса альфа компилятором будет выбран
00:12:53
конструктор альфа по умолчанию
00:13:03
пример 2 конструктора класса бета
00:13:07
содержит более обширный список
00:13:10
инициализации куда включена выражение
00:13:13
для инициализации
00:13:15
собственного строго атрибута а также под
00:13:19
объекта альфа обратите внимание что и в
00:13:22
первом и во втором случае
00:13:25
тело конструктора бета держится на
00:13:28
минимально возможном уровне и образуется
00:13:31
пустым комплектом фигурных скобок
00:13:39
стандартный для языка си плюс плюс
00:13:42
порядок вызова конструкторов базовых
00:13:45
производных классов и атрибутов был нами
00:13:49
рассмотрен и обоснован немного ранее тот
00:13:54
же самый порядок рассуждений но
00:13:57
соответствующий поправкой можно
00:13:59
применить и к инструкторам классов
00:14:03
деструкторы классов вызываются прямо
00:14:06
противоположном порядке по отношению к
00:14:09
конструкторам сам их порядок вызова а
00:14:13
также противоположность порядков вызова
00:14:17
конструкторов и деструкторов являются
00:14:20
примерами
00:14:21
строгих гарантий языка си плюс плюс
00:14:24
иными словами на эти факты языка си плюс
00:14:29
плюс мы в любой ситуации можем наверняка
00:14:32
полагаться о виртуальных
00:14:35
методах классов как инструменте который
00:14:39
позволяет максимально отложить момент
00:14:44
принятия решения о том какой конкретно
00:14:47
метод класса в иерархии классов
00:14:51
будет вызван мы уже говорили напомним
00:14:55
что понятие виртуальных методов
00:14:58
неразрывно связано с понятием точки
00:15:02
фиксации
00:15:04
используя виртуальные методы мы
00:15:07
переносим точку фиксации на момент
00:15:11
исполнения кода и имеем
00:15:13
вас поздним или динамическим связыванием
00:15:18
отказываясь от виртуальных функций или
00:15:22
следуя вдоль объектной модели языка си
00:15:25
плюс плюс которая принята в самом языке
00:15:28
по умолчанию мы фиксируем момент
00:15:32
принятия решения на этапе компиляции или
00:15:37
говорим о раннем либо статическом
00:15:40
связывание по аналогии с ранним и
00:15:44
поздним связыванием или статическим и
00:15:49
динамическим связыванием можно говорить
00:15:52
о статических и динамических типов тех
00:15:57
объектов ссылок и указателей который
00:16:01
используется для организации полиморфных
00:16:05
вызовов рассматривая тот тип который
00:16:10
приписан указателю или ссылки и
00:16:14
известен на момент компиляции мы можем
00:16:17
говорить о статическом теперь этого
00:16:21
указателя
00:16:22
или такой ссылке понимая что эта ссылка
00:16:28
может служить инструментом для адресации
00:16:32
экземпляров производных классов мы
00:16:35
допускаем что реальный то есть
00:16:38
динамический тип объекта адресу имаго по
00:16:43
такой ссылке равны по указателю может
00:16:46
отличаться от статического если наши
00:16:51
классы и их иерархии не носят
00:16:54
полиморфного характера то есть не
00:16:57
содержит виртуальных функций то
00:16:59
статический и динамический тип объекта
00:17:03
всегда будут совпадать контекст в
00:17:08
котором умение различать
00:17:10
статические и динамические типы
00:17:14
является важным состоит к примеру в
00:17:19
разрешении формальных параметров
00:17:22
значение формальных параметров
00:17:25
должны определяться на этапе компиляции
00:17:28
так происходит как случае полиморфных
00:17:32
так и в случае не полиморфных объектов
00:17:38
механизм виртуализации методов классов
00:17:42
работает по принципу виртуальные однажды
00:17:46
виртуальные навсегда тем не менее
00:17:51
механизм виртуализации то есть позднего
00:17:55
или динамического связывания методов
00:17:58
можно подавить явным обращением к
00:18:03
конкретному методу находящемуся в той
00:18:07
или иной области видимости в качестве
00:18:11
идентификатора этой области видимости
00:18:14
как уже наверняка догадались
00:18:17
будет выступать имя соответствующего
00:18:20
класса причина по которой
00:18:25
такое подавление виртуализации может
00:18:29
оказаться важным по сути всего одна это
00:18:34
повышение производительности
00:18:37
конкретных фрагментов кода работа с
00:18:42
виртуальными методами на уровне
00:18:45
производных классов долгие годы была не
00:18:49
самой сильной стороной
00:18:51
языка си плюс плюс ситуация стала
00:18:55
меняться в диалекте си плюс плюс 11
00:18:59
причина прежних неудобств было связано с
00:19:03
тем что qualify катар rachel являлся да
00:19:07
и является до сих пор не обязательным
00:19:10
для методов определенных на уровнях
00:19:14
иерархии ниже чем первое упоминание
00:19:18
метода которая вводит его как
00:19:22
виртуальный новации
00:19:25
языка си плюс плюс 11 связаны со
00:19:29
специфика тарам аурой
00:19:32
применение спецификатор аурой
00:19:35
дает
00:19:36
вам как программистом возможность явно
00:19:39
выразить ранее только подразумевал суйся
00:19:42
мысль
00:19:43
мысль которая заключается в том что
00:19:47
перекрываем эй таким образом метод
00:19:50
является виртуальные функции класса и
00:19:53
имеет ровно такую же сигнатуру
00:19:56
как аналогичный одноименный метод в
00:20:01
классе предки примеры
00:20:05
допустимого и 2 недопустимых применение
00:20:09
данного спецификатор а приведены на
00:20:12
текущем слайде в частности на примере
00:20:16
допустимого
00:20:17
использования мы видим как выглядит
00:20:21
применение играет на практике
00:20:35
обратите внимание что write это не
00:20:38
ключевое слово языка си плюс плюс это
00:20:43
один из вновь введенных в состав языка
00:20:47
спецификатор of которые имеют
00:20:51
обсуждаемую нами семантику только в
00:20:55
определенных контекстах
00:20:57
другими словами на явное перекрытие
00:21:01
виртуальных методов слова write
00:21:05
указывает только тогда когда оно
00:21:08
употребляется в составе определение
00:21:12
класса в составе сигнатуры виртуального
00:21:17
метода во всех остальных случаях к
00:21:21
примеру в кодовой базе унаследованные
00:21:24
системы это слово может оставаться и
00:21:27
по-прежнему выполнять роль
00:21:30
какого-либо объекта хранения или функции
00:21:35
конечно с появлением данного элемента в
00:21:39
языке си плюс плюс 11 употребление слова
00:21:43
write как имени переменной или
00:21:46
глобальной функции становится гораздо
00:21:48
менее желательным тем не менее при
00:21:53
поддержании унаследованной кодовой базы
00:21:56
это не означает что мы должны
00:21:59
хвататься за голову и заниматься
00:22:02
переименованием соответствующих объектов
00:22:05
говоря об идентичности
00:22:08
сигнатур перекрывающего и перекрываемого
00:22:12
методов необходимо обращать внимание на
00:22:16
каждую деталь
00:22:17
включая qualify катар const
00:22:20
действительно константный метод
00:22:23
производного класса
00:22:24
не может перекрывать не константный
00:22:27
метод базового класса и наоборот
00:22:32
кроме того в языке си плюс плюс 11 и
00:22:37
секрет плюс 14 также как и в более
00:22:41
старых диалектах этого языка мы можем
00:22:46
перекрывать в
00:22:48
акции не используя qualify катар повара
00:22:51
it однако если он применяется то он
00:22:55
должен относиться только к виртуальным
00:22:58
методом классов не виртуальные методы
00:23:02
или методы не нацелены на применение и
00:23:07
поддержку полиморфизма классов не могут
00:23:11
сопровождаться этим новым спецификатор
00:23:15
особое место в ряду виртуальных методов
00:23:20
занимают чистые виртуальные функции
00:23:26
определяя метод класса как виртуальный
00:23:30
мы должны предложить его реализацию либо
00:23:36
определить тот факт что данный класс не
00:23:40
содержит реализации соответствующего
00:23:43
метода на своем уровне иерархии
00:23:49
определение метода как не имеющего
00:23:52
реализацию
00:23:53
имеет сугубо архитектурное значение
00:23:57
определяя метод как не имеющий
00:24:00
реализации мы вменяем классом потомкам
00:24:04
данного класса обязанность предложить
00:24:08
такую реализацию это обязанность может
00:24:12
быть исполнено как в прямых так и в
00:24:16
косвенных
00:24:17
потомках данного рассматриваемого класса
00:24:23
формальным признакам чистый виртуальной
00:24:27
функции в классе является спецификатор
00:24:30
порядок использования которого
00:24:33
проиллюстрирован в нашем 1 срочном
00:24:36
примере
00:24:41
в большинстве случаев чистые виртуальные
00:24:46
функции и функции класса не имеющие
00:24:49
предложенной реализации
00:24:51
совпадают однако вообще говоря эти
00:24:55
множества не являются идентичными
00:24:58
с точки зрения языка си плюс плюс
00:25:01
функция может являться чистый
00:25:04
виртуальный и при этом не иметь
00:25:06
реализации в то же время любая функция
00:25:09
не имеющие реализации должна быть
00:25:13
определена как чистое виртуальная
00:25:17
включение в состав
00:25:19
класса чистых виртуальных функций делает
00:25:23
такой класс интерфейсом интерфейсом
00:25:27
столь точки зрения как это понятие
00:25:30
принято трактовать в архитектуре
00:25:34
как отдельный базовый элементарный
00:25:38
шаблон проектирования о шаблонах
00:25:42
проектирования объектно-ориентированных
00:25:44
систем речь пойдет во второй части
00:25:46
нашего курса
00:25:48
пока же обратим внимание на то что
00:25:51
чистые виртуальные функции
00:25:53
являют собой пример внедрение такого
00:25:57
несложного шаблона в ткань программного
00:26:00
кода если с точки зрения архитектуры
00:26:04
класс с чистыми виртуальными функциями
00:26:07
это пример интерфейса то с точки зрения
00:26:12
языка си плюс плюс
00:26:13
класс с чистыми виртуальными функциями
00:26:16
является абстрактным для абстрактного
00:26:20
класса запрещено одна из основных
00:26:23
операций инстанцирован ее
00:26:26
или создание экземпляров по этой причине
00:26:31
мы не только не имеем права определять
00:26:34
объекты хранения тип которых совпадает с
00:26:38
рассматриваемым абстрактным классом но и
00:26:41
использовать данный абстрактный класс
00:26:44
как тип формальных параметров или
00:26:48
результата
00:26:49
глобальные функции или метода класса
00:26:53
что же касается определения
00:26:56
варианта реализации чистой виртуальные
00:27:00
функции то такое возможно тело чистой
00:27:05
виртуальные функции всегда определяется
00:27:08
вне тела класса
00:27:11
она может использоваться для того чтобы
00:27:14
задать
00:27:16
определенную общую логику к который
00:27:19
должны обращаться конкретные реализации
00:27:23
в каждом из производных классов такое
00:27:27
решение является достаточно редким но
00:27:31
все же очень удачным с архитектурной
00:27:34
точки зрения
00:27:35
поэтому знать и помнить о том что чистые
00:27:40
виртуальные функции могут иметь тело мы
00:27:44
должны вернемся к нашим любимым классом
00:27:50
альфа и бета
00:27:52
пусть в классе арфа определено чистая
00:27:56
виртуальная функция дисплей которая
00:28:00
имеет свое тело для того чтобы
00:28:03
воспользоваться этим телом функции альфа
00:28:07
дисплей необходимо произвести явный не
00:28:12
полиморфный вызов этой функции
00:28:14
так как показано на нашем слайде
00:28:23
в связи с отсутствием в арсенале языка
00:28:27
си плюс плюс
00:28:28
ключевого слова или спецификатор а
00:28:31
который обозначал бы класс как
00:28:34
абстрактной при разработке иногда
00:28:37
возникает
00:28:38
специфическая проблема класс необходимо
00:28:42
ввести
00:28:43
и определить как абстрактный но
00:28:46
подходящего на роль чистой виртуальной
00:28:49
функции метода кандидата нет в этом
00:28:54
случае таким методом может стать
00:28:58
деструктор класса в отличие от
00:29:01
конструкторов деструктор хотя и является
00:29:05
специальным методом класса может быть
00:29:08
определен как виртуальный более того он
00:29:12
может быть определен как чистая
00:29:15
виртуальная функция хотя будучи и
00:29:18
деструкторов он обязан иметь некоторое
00:29:21
тело в этом случае
00:29:24
деструктор даже став чистой виртуальной
00:29:27
функций будет определён нами хотя и вне
00:29:31
тела класса по тем причинам
00:29:34
о которых мы говорили ранее порядок
00:29:38
определения деструктора как чистые
00:29:42
виртуальные функции для превращения
00:29:45
класса в абстрактной проиллюстрируем уже
00:29:48
привычными нам
00:29:49
структурами альфа и бета пусть наша
00:29:54
архитектурная задача заключается в том
00:29:57
чтобы сделать
00:29:58
структуру альфа абстрактным классом для
00:30:02
этого мы должны сделать чистый
00:30:06
виртуальные функции один из ее методов
00:30:09
однако метод в составе этой структуры
00:30:13
всего один это деструктор который в
00:30:18
некотором роде искусственно введен в
00:30:20
состав структуры для того чтобы решить
00:30:23
наш архитектурный ребус определение
00:30:28
деструктора структуры
00:30:30
альфа как чистый
00:30:33
виртуальные функции не запрещает а
00:30:42
напротив
00:30:43
требует от нас одновременного
00:30:46
определения тело этого деструктора но
00:30:49
уже вне определение класса
00:30:58
пусть в простейшем случае тело этого
00:31:01
деструктора
00:31:02
будет представлена пустым комплектом
00:31:06
фигурных скобок
00:31:08
превращение структуры
00:31:10
альфа абстрактный класс препятствует ее
00:31:14
явному инстанции рование связи с этим
00:31:19
пример попытки создания экземпляра
00:31:23
структуры альфа оформлен нами как
00:31:26
комментарий в коде в то же время
00:31:29
инстанциировать
00:31:31
производную структуру бета которая не
00:31:36
является абстрактным классом мы вполне
00:31:39
можем
00:31:48
деструктор структуры бета очевидно не
00:31:52
наследуется от деструктора структуры
00:31:55
альфа это самостоятельный специальный
00:31:59
метод определяемый программистом или
00:32:02
генерируемый компилятором связи с тем
00:32:06
что структура бета не имеет никаких иных
00:32:10
унаследованных чистых виртуальных
00:32:13
функций она теряет статус
00:32:16
абстрактного класса превращаясь в
00:32:18
конкретный класс
00:32:20
как конкретный класс структура бета
00:32:24
имеет все формальные основания быть
00:32:27
инстанцирован эй разработчик еще одним
00:32:32
долгожданным нововведением языка си плюс
00:32:35
плюс 11 стало появление финальных
00:32:39
методов и финальных классов как следует
00:32:45
из их названия финальные методы являются
00:32:50
архитектурным инструментом запрета
00:32:53
перекрывать реализацию предложенную
00:32:57
базовым классом во всех производных
00:33:01
классах аналогичным образом
00:33:04
финальный класс также являющийся
00:33:08
архитектурным понятием предполагает
00:33:11
полный запрет наследование от этого
00:33:16
класса
00:33:17
иными словами реализация предложенная в
00:33:22
составе финального метода будет повторно
00:33:26
использоваться на всех уровнях иерархии
00:33:29
в прямых и косвенных потомках данного
00:33:33
класса что же касается финальных классов
00:33:39
то финальные классы будут располагаться
00:33:42
строго в листовых вершинах дерево или
00:33:47
графа наследования рассмотрим каким
00:33:52
образом
00:33:53
вводятся финальные методы и финальные
00:33:56
класса финальные
00:33:59
методы и финальные классы вводятся при
00:34:02
помощи одного и того же спецификатор а
00:34:06
файл с точки зрения грамматики языка
00:34:10
спецификатор файл почти ничем не
00:34:13
отличается от спецификатор a favorite
00:34:17
иными словами слова файлов выступает как
00:34:22
определяющий характер метода или класса
00:34:25
только в своем контексте
00:34:28
во всех остальных случаях его
00:34:30
употребления в исходном коде программ
00:34:33
слова файл можно приступать к примеру
00:34:37
идентификатором переменной или
00:34:39
глобальной функции применительно к
00:34:44
методам классов спецификатор файл
00:34:47
работает только с виртуальными методами
00:34:55
именно по этой причине применение
00:34:59
спецификатор а файл с методом баб
00:35:03
является недопустимым
00:35:08
применение спецификатор а файл с методом
00:35:12
в свою очередь означает что этот метод
00:35:16
даже будучи виртуальном не может
00:35:19
перекрываться в структурах потомках
00:35:22
структуры альфа
00:35:25
свою очередь структура бета является
00:35:30
финальной структурой
00:35:37
с практической точки зрения это означает
00:35:40
что у неё не может быть потомков и
00:35:44
попытка определения как таковой
00:35:48
структура гамма является некорректным

Описание:

Курс "Углубленное программирование на С С++" Для начинающих программистов, владеющих основами языков C и C++ Время прохождения курса: 25 часов Курс формирует практические умения и навыки разработки программных систем среднего уровня сложности на языке C++ с применением стандартной библиотеки языка, а также типовых приемов (шаблонов) объектно-ориентированного проектирования. В курсе рассматриваются ключевые аспекты эффективной работы с памятью, безопасного программирования, асинхронных вычислений, делается краткий экскурс в возможности диалектов C++11/C++14. Преподаватели: Алексей Петров - эксперт-практик в области информационного и программного обеспечения автоматизированных систем и языков программирования высокого уровня. Дмитрий Исайкин - ведущий разработчик в компании Mail.Ru Group. Больше 10 лет своей профессиональной деятельности разрабатывал и проектировал бэкенды высоконагруженных проектов (рекомендательные системы, системы сбора, доставки и хранения почты), в основном на C/C++. Последнее время переключился на мобильную разработку под iOS. ------------------------ О КАНАЛЕ: Официальный канал образовательных проектов Mail.Ru Group ► Нажмите здесь для подписки ‣ https://www.youtube.com/TPMGTU?sub_confirmation=1 Актуальные лекции и мастер-классы о программировании от лучших IT-специалистов. Если вы увлечены мобильной и веб-разработкой, присоединяйтесь! ------------------------ НАШИ ПРОЕКТЫ: Технопарк при МГТУ им. Баумана ‣ https://park.vk.company/pages/index/ Техносфера при МГУ им. Ломоносова ‣ https://sphere.vk.company/pages/index/ Технотрек при МФТИ ‣ https://goo.gl/WGiVAP Техноатом при МИФИ - https://browser.ru/ Технополис при СПбПУ - https://polis.vk.company/pages/index/ Блог на Хабре | https://habr.com/en/companies/mailru/articles/ IT - Чемпионаты | https://cups.online/

Готовим варианты загрузки

popular icon
Популярные
hd icon
HD видео
audio icon
Только звук
total icon
Все форматы
* — Если видео проигрывается в новой вкладке, перейдите в неё, а затем кликните по видео правой кнопкой мыши и выберите пункт "Сохранить видео как..."
** — Ссылка предназначенная для онлайн воспроизведения в специализированных плеерах

Вопросы о скачивании видео

mobile menu iconКак можно скачать видео "Углубленное программирование на С С++ Лекция 12"?mobile menu icon

  • Сайт http://unidownloader.com/ — лучший способ скачать видео или отдельно аудиодорожку, если хочется обойтись без установки программ и расширений. Расширение UDL Helper — удобная кнопка, которая органично встраивается на сайты YouTube, Instagram и OK.ru для быстрого скачивания контента.

  • Программа UDL Client (для Windows) — самое мощное решение, поддерживающее более 900 сайтов, социальных сетей и видеохостингов, а также любое качество видео, которое доступно в источнике.

  • UDL Lite — представляет собой удобный доступ к сайту с мобильного устройства. С его помощью вы можете легко скачивать видео прямо на смартфон.

mobile menu iconКакой формат видео "Углубленное программирование на С С++ Лекция 12" выбрать?mobile menu icon

  • Наилучшее качество имеют форматы FullHD (1080p), 2K (1440p), 4K (2160p) и 8K (4320p). Чем больше разрешение вашего экрана, тем выше должно быть качество видео. Однако следует учесть и другие факторы: скорость скачивания, количество свободного места, а также производительность устройства при воспроизведении.

mobile menu iconПочему компьютер зависает при загрузке видео "Углубленное программирование на С С++ Лекция 12"?mobile menu icon

  • Полностью зависать браузер/компьютер не должен! Если это произошло, просьба сообщить об этом, указав ссылку на видео. Иногда видео нельзя скачать напрямую в подходящем формате, поэтому мы добавили возможность конвертации файла в нужный формат. В отдельных случаях этот процесс может активно использовать ресурсы компьютера.

mobile menu iconКак скачать видео "Углубленное программирование на С С++ Лекция 12" на телефон?mobile menu icon

  • Вы можете скачать видео на свой смартфон с помощью сайта или pwa-приложения UDL Lite. Также есть возможность отправить ссылку на скачивание через QR-код с помощью расширения UDL Helper.

mobile menu iconКак скачать аудиодорожку (музыку) в MP3 "Углубленное программирование на С С++ Лекция 12"?mobile menu icon

  • Самый удобный способ — воспользоваться программой UDL Client, которая поддерживает конвертацию видео в формат MP3. В некоторых случаях MP3 можно скачать и через расширение UDL Helper.

mobile menu iconКак сохранить кадр из видео "Углубленное программирование на С С++ Лекция 12"?mobile menu icon

  • Эта функция доступна в расширении UDL Helper. Убедитесь, что в настройках отмечен пункт «Отображать кнопку сохранения скриншота из видео». В правом нижнем углу плеера левее иконки «Настройки» должна появиться иконка камеры, по нажатию на которую текущий кадр из видео будет сохранён на ваш компьютер в формате JPEG.

mobile menu iconСколько это всё стоит?mobile menu icon

  • Нисколько. Наши сервисы абсолютно бесплатны для всех пользователей. Здесь нет PRO подписок, нет ограничений на количество или максимальную длину скачиваемого видео.