Step 5 (S-10676)

From Stepik Wiki
Jump to: navigation, search

Step on Stepik: https://stepik.org/lesson/554/step/5

Step 5 (S-10676) 1.png

[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] был вызван деструктор именно базового класса который ничего не знает про те поля которые уже добавлены в производном классе как это исправить правильной реализации нужно просто указать что деструктор базового класса являются виртуальными


Step 5 (S-10676) 2.png

[02:33 - 02:48] например если деструктор базовых класса мы какой то простой есть мы даже не определяли то можно определить деструктор указав что он картофеля в этом случае деструктор будет пустым мере в этом я таких сложных парень который надо к спецам


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


[03:05 - 03:24] удалить объект типа через указатель на базовый класс будет вызван не деструктор непосредственно класса прошлом а насчет того что деструктор в позапрошлом является виртуальным будет вызван деструктор класса стилем который в свою очередь вызовет сначала деструктор


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


[03:40 - 03:56] то есть если вы пишете класс таким образом что вы предполагаете что не будет наследоваться то вы должны будете написать виртуальный деструктор для того чтобы с этим классом можно было общаться через указатель на базовый класс