Difference between revisions of "Step 5 (S-10676)"
(Create page for step id=10676) |
|||
Line 1: | Line 1: | ||
Step on Stepik: https://stepik.org/lesson/554/step/5 | Step on Stepik: https://stepik.org/lesson/554/step/5 | ||
− | + | [[File:Step_5_(S-10676)_1.png|border|800px]] | |
[00:00 - 00:17] 1 из важных применения виртуальных методов это виртуальный деструктор давайте разберемся зачем он нужен пусть нас есть базовый класс прошлом и производные классы людям которые как это было в 1 из наших 1 примеров расширяет класс прошлом при помощи | [00:00 - 00:17] 1 из важных применения виртуальных методов это виртуальный деструктор давайте разберемся зачем он нужен пусть нас есть базовый класс прошлом и производные классы людям которые как это было в 1 из наших 1 примеров расширяет класс прошлом при помощи | ||
Line 30: | Line 30: | ||
− | + | [[File:Step_5_(S-10676)_2.png|border|800px]] | |
[02:33 - 02:48] например если деструктор базовых класса мы какой то простой есть мы даже не определяли то можно определить деструктор указав что он картофеля в этом случае деструктор будет пустым мере в этом я таких сложных парень который надо к спецам | [02:33 - 02:48] например если деструктор базовых класса мы какой то простой есть мы даже не определяли то можно определить деструктор указав что он картофеля в этом случае деструктор будет пустым мере в этом я таких сложных парень который надо к спецам |
Latest revision as of 12:40, 7 August 2017
Step on Stepik: https://stepik.org/lesson/554/step/5
[00:00 - 00:17] 1 из важных применения виртуальных методов это виртуальный деструктор давайте разберемся зачем он нужен пусть нас есть базовый класс прошлом и производные классы людям которые как это было в 1 из наших 1 примеров расширяет класс прошлом при помощи
[00:17 - 00:32] хранение название университета в котором учатся в данной статье дано есть еще поле июня типа string в котором хранится университет давайте посмотрим что будет если мы создадим объект класса student
[00:32 - 00:48] и будем общаться с ним через указатель на базовый класс мы выделим объекте пасьют динамической памяти то есть на кучу и после этого сохраним его через указатель на базовый класс
[00:48 - 01:07] что может дать что то с ним поработать а после этого мы вышлем оператор delete оператор перед непосредственным освобождением памяти вызвать деструктор вопрос какой деструктор он вызовет оказывается что в данном случае нет никакой разницы
[01:07 - 01:25] с обычными методами если деструктор позапрошлом не является виртуальным будет вызван деструктор именно класса прошлом которое ничего не знает про боль июня которая присутствует только в наследнике в классе
[01:25 - 01:40] поэтому он не вызовет деструктор поле июня а значит так строка которая хранится в этом бульоне в нашем случае это
[01:40 - 01:58] строка с названием университета оксфорд строка которая хранится где то в динамической памяти и деструктор июня 4 класса тоже эту строку удалить так вот деструктор для этого поля вы этого не будет и соответственно
[01:58 - 02:17] при удалении объекта это строка оксфорд останется таким образом получим утечку понять почему это произошло потому что мы общались с объектом через указатель на базовый класс и за счет того что деструктор был не в виртуальном
[02:17 - 02:33] был вызван деструктор именно базового класса который ничего не знает про те поля которые уже добавлены в производном классе как это исправить правильной реализации нужно просто указать что деструктор базового класса являются виртуальными
[02:33 - 02:48] например если деструктор базовых класса мы какой то простой есть мы даже не определяли то можно определить деструктор указав что он картофеля в этом случае деструктор будет пустым мере в этом я таких сложных парень который надо к спецам
[02:48 - 03:05] но это будет достаточно для того чтобы данный код который работает с производным классом через указатель на работу правильно то есть мы просто добавили виртуальный деструктор базовый класс и это нам гарантирует что когда мы будем
[03:05 - 03:24] удалить объект типа через указатель на базовый класс будет вызван не деструктор непосредственно класса прошлом а насчет того что деструктор в позапрошлом является виртуальным будет вызван деструктор класса стилем который в свою очередь вызовет сначала деструктор
[03:24 - 03:40] полей класса student а после этого уже по восходящей вызвать деструктор своего предка таким образом виртуальный деструктор это очень важный момент если вы пишете класс от которого можно будет наследовать
[03:40 - 03:56] то есть если вы пишете класс таким образом что вы предполагаете что не будет наследоваться то вы должны будете написать виртуальный деструктор для того чтобы с этим классом можно было общаться через указатель на базовый класс