Step 5 (S-10682)

From Stepik Wiki
Jump to: navigation, search

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

Step 5 (S-10682) 1.png

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


[00:16 - 00:35] post профессор настоящий кластер и базовом классе просто на определенный метод возвращающий имя человек конечно же еще должен быть виртуально деструктор но будем считать что он скрывается за этим многоточие так как метод является виртуальным то можно


[00:35 - 00:53] переопределить у наследников и мы сделаем это для класса профессор как мы это уже неоднократно делали мы переопределяем это таким образом чтобы он возвращал имя с приставкой то есть уважительное обращение к правительству


[00:53 - 01:10] теперь мы хотим проверить действительно ли виртуальные методы ведут себя как не виртуальное в конструкторах деструкторах для этого мы вызвали меня тут name внутри конструктора промежуточного класса конструктор будет вызван


[01:10 - 01:28] при создании объекта профессор и если мы там вызвали метод то в зависимости от того выведется имя профессора с приставкой профиле без приставки про будет понятно ведет себя метод на им как виртуальный или как нибудь


[01:28 - 01:43] соответственно мы создадим переменную профессор при создании объекте профессор будет вызван сначала конструктор класса потом конструктор класса


[01:43 - 02:00] и потом конструктор класса профессора ну точнее могу сказать что конструктор класса профессор вызвать конструктор класс тичер вызовет так открытый базовых классов конструктор нас профессор но выполняться конструктор будет именно от самого базового к самому процессу


[02:00 - 02:18] поэтому при создании объекта профессор будет том числе вызван конструктор класса тичер там будет вызван метод name если мы запустим этот код то окажется что метод который в интернет выкладывается это будет сутки метод с базу


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


[02:35 - 02:51] вызвался именно метод соответствующих профессий но оказывается что то не так давайте сначала почему это поведение правильно если мы разрешили вызывать внутри этого промежуточного класса


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


[03:07 - 03:23] как я сказал конструктор вызывается именно в таком порядке сначала вызывается конструктор класса петерсон потом конструктор класса а потом конструктор класс профессора то есть тот момент когда мы вызываем конструктор класса тичер конструктор класса профессора еще не вызывался


[03:23 - 03:43] значит все поля которые есть в классе профессора они еще не инициализирована я ничего не вызваны конструкторы поэтому если бы в каком то какой то из реализации виртуальных метод определенных в классе профессора мы обращались к полям этого класса


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


[03:59 - 04:14] в деструкторе промежуточного класса пытаясь хоть какой то виртуальный метод мы пытались обратиться потенциально к данным которые уже удалены так деструктор вызывается обратном порядке то есть начало деструктор класса профессор потом класса тичера и только в конце класса прошлом


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


[04:33 - 04:51] теперь как это реализовано на практике это то что реализовано это все очень естественно как я говорил указатель на таблицу виртуальных методов которые находятся объекты он интересуется в конструктор так как в данном случае при создании класса профессора создает


[04:51 - 05:07] называется 3 конструктора то есть сначала вызывается конструктор класса петерсон и внутри этого конструктора указателем таблице виртуальных методов инициализируется адресом таблица виртуальных методов соответствующим государством то есть внутри


[05:07 - 05:21] конструктор класса петерсон указатель на таблицу виртуальных методов объекта который мы создаем то есть несмотря на то что мы создаем объект а вы профессор но в самом начале в конструкторе класса то что он этот показатель который хранится этом объекте профессор


[05:21 - 05:37] еще не создано он указывает на таблицу соответствующую таблица виртуальных методов класса person потом когда мы заходим в конструктор класса тичер внутри этого конструктора


[05:37 - 05:55] указателей перенаправляется на таблицу виртуальных методов класса интересно все методы которыми вы за внутри конструктора класс они ведут себя так как если бы объекту которых израиле был бы именно объектом класса


[05:55 - 06:12] ну и последний конструктор который вызывается конструктор класса профессор внутри него в самом начале указатель на таблицу виртуальных функций инициализируется адресом таблице виртуальных функций классов профессор совместно внутри класса


[06:12 - 06:27] конструктор класс профессора уже во вторник функции ведут себя так как будто бы объект который которым мы сейчас работаем это объект а профессор аналогично происходит в деструкторе начало вызывается деструктор


[06:27 - 06:43] класса профессор после этого при переходе в деструкторе класс профессора 5 структуру класса тичер указателями таблица виртуальных функций переставляется на с адреса таблица виртуальных функций для профессора переставляется на адрес


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


[07:02 - 07:21] класса прошлом также указатель таблице виртуальных методов переставляется с таблица виртуальных методов соответствующий класс утечек на таблицу виртуальных методов соответствующие классу кажется таким образом за счет достаточно естественно процесса


[07:21 - 07:40] а ну при для конструктора просто естественно да так я сказал что в конструкторе именно на этот адрес интерьера для деструктор нам приходится дополнительно переставлять но тоже получается симметрично прямо в конструкторе переставляем с таблица виртуальных методов


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


[07:59 - 08:00] * Audio is not recognized *