Step 3 (S-10679)

From Stepik Wiki
Revision as of 12:40, 7 August 2017 by Admin (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Step on Stepik: https://stepik.org/lesson/555/step/3

Step 3 (S-10679) 1.png

[00:00 - 00:16] да теперь например обсудим как могли быть организованы таблицы виртуальных методов пусть у базового класса тоже наверное 2 вертикальных метода это виртуальный деструктор и чистой виртуальной методах и париж напомню что виртуальный деструктор необходим


[00:16 - 00:31] в случаях когда мы предполагаем что данного класса можно будет наследоваться и даже работать с объектами производных классов полиморфно то есть через указатели на базовый класс если в таком случае мы не об я деструктор базовых классов как виртуальный


[00:31 - 00:47] то при удалении объекта производного класса через указатель на базовый класс всегда будет называться деструктор вместо соответствующую деструктор призвана что может привести к утечкам некорректной работе программы принципе так употребляется некорректно


[00:47 - 01:05] потому что у нас какой то он создает объект производного класса а удаляется только его часть соответствующие базовому классу соответственно если мы откроем такой по которым можно следовать потом работать с его наследниками то мы обязаны объявить


[01:05 - 01:22] деструктора то класса как на практике это почти всегда означает что если вы определили хотя бы 1 виртуальную функцию то вы должны объявить деструктор виртуальным это такое правило по которому надо привыкнуть и довести до автоматизма


[01:22 - 01:39] дать фасон как для такого класса могла быть реализована таблице виртуальных нет так как у класса прошлом всего 2 виртуальных метода нет не является виртуальным то в такой таблице было всего 2 ячейки в 1 хранился бы адрес


[01:39 - 01:55] деструктора класса петерсон какой то конкретный адрес который соответствует адрес этого инструктора а 2 чеки которые соответствуют честному виртуальном методу пышно мы записали 0


[01:55 - 02:13] почему ну потому что этот метод является чистым ритуальным то есть он вообще не существует реализацией для данного класса поэтому нет адрес работы метода который можно было сразу писать и мы укажем посмотрим что происходит с производными классами у нас есть некоторые производные класс


[02:13 - 02:29] и от этого класса student мы переопределяем метод occupational и добавим еще 1 виртуальную еще 1 виртуальный метод групп которые соответствуют номер группы 100 лет


[02:29 - 02:48] посмотри какая таблица будет соответствовать классу 1 2 ячейки таблицы будут соответствовать ничейку из таблицы класса прошлом в 1 будет записан адрес деструктора данном случае уже адрес деструктор классов


[02:48 - 03:06] при этом это произойдет несмотря на то что мы деструктор класса student небеса я всего сгенерирует кооператор и запишет это соответствующий адрес в таблицу виртуальных методов соответствующих прав а во 2 ячейке будет указан


[03:06 - 03:20] адрес соответствующий реализации нет удобнейшем в данном случае это уже не нулевой адрес дам так мы определили этот метод в классе то у него уже есть адрес который можно записать в таблицу виртуальных


[03:20 - 03:36] не будет еще 3 человека который будет соответствовать новую виртуальную но виртуальную методу который объявлен уже непосредственно в классе сюда то есть этот метод будет виртуальным для посудины и для всех его наследников


[03:36 - 03:52] так этот метод не является чисто визуальным то него тоже есть какой то адрес то есть вот есть реализации есть какой то отмечу что синтаксически а нет он в классе


[03:52 - 04:10] объявлен как не вертолет но он является виртуальной потому что в базовом классе есть объявление то методы как виртуально но в принципе могли бы написать что то то то то бы ничего не изменилось то есть не виртуальном этот метод бы не стал но слово видел перед методом


[04:10 - 04:27] в классе не обязательно хотя мож ничего не будет а еще 1 замечание что конечно же то что там рассказывают некоторые прощения на практике и к нам в этих технических тонкостей в том числе например а


[04:27 - 04:46] я сказал что в ячейку которая соответствует чистом портаменто экипаж будет записано 0 ну это даже некра смысле объяснил бы вот это мне магической обозначения для чистых виртуальных методов тошно пишем что метод равен 0 это соответствует 0 соответствующие ячейки


[04:46 - 05:03] в таблице виртуальных методов так вот на практике сюда записывает не 0 а адрес функции обработчика то есть в том случае если мы вызываем чистый лист виртуальный метод как это сделать то зачем размышления о деятельности компилятором не позволят


[05:03 - 05:19] напрямую но это можно сделать а соответственно если вы вызываете 4 место то вместо падении 7000 будет вызвана функция обработчик в принципе это даже можно обработать то есть в вашем коде


[05:19 - 05:36] как то обработать там будет выигрышно некоторых специально исключения вот но это уже все тонкости и да довольно сложной материи поэтому на базовом уровне можно представить что все устроено так как я написал то есть там действительно


[05:36 - 05:44] записан нулевой указатель если мы попытаемся каким то образом опосредованно обратился к нему то это приведет к падению программ