Виртуальный деструктор класса C++. Что это такое. Наследование. Полиморфизм. Для начинающих
HTML-код
- Опубликовано: 3 ноя 2017
- Понравилось видео или оказалось полезным? Подпишись!
Поддержка канала
/ simplecode
Виртуальный деструктор класса C++. Что такое. Зачем нужен. Наследование. Полиморфизм. ООП C++ Для начинающих. Урок #105
Указатели c++ что это. Для чего нужны. Указатели c++ разыменование. C++ для начинающих. Урок #46
goo.gl/At5m7a
Конструктор класса пример. Зачем нужен. Конструктор с параметрами. Конструктор по умолчанию. Урок#78
goo.gl/LX6HAz
Деструктор что это. Зачем нужен деструктор класса в ООП. Деструктор с параметрами. Перегрузка. #80
goo.gl/N3HeDN
Уроки по программированию
Наша группа ВК smplcode
Подписывайтесь на канал / @simplecodeit
*Друзья, если вы решили изучать программирование и подписались на канал - рекомендую вам нажать колокольчик чтобы никогда не пропускать новые уроки!*
Снимите, пожалуйста, видео о том, как разделять проект на файлы и как это всё подключать между собой, как подключать сторонние библиотеки, создавать свои, или просто как подключить готовый класс к проекту. Как пользоваться hex-редакторами и смаке.
Довод опыт да дар швед давно
Тут остались только самые настойчивые и заинтересованные ребята. Спасибо за видео!
🙃 не только! здесь началось самое прикольное! ООП гораздо веселее чем процедурный код😉. Только теперь появился настоящий интерес
за 8 месяцев как продвинулись?
это все базовая база, самое начало начал, так сказать
ты просто лучший человек!!
Спасибо за бесценный труд!)
#виртуальныйдеструктор #ООП #SimpleCode #урокипрограммирования
Спасибо за урок! Жирнющий такой ЛАЙК!
Большое спасибо за урок! Смотрим всей студенческой группой)
Как всегда на высоте и как всегда спасибо!
Спасибо за урок!
Спасибо за хороший урок!
Как всегда, очень хорошо.
Как раз то что доктор прописал!!!
просто коммент для продвижения!
Очень странно, что так мало у Вас подписчиков, принимая во внимание качество контента. Скажу только вот что, удачи Вам.) Надеюсь в скором времени всё изменится в кардинально лучшую сторону. Ведь всё таки у Вас на порядок более хорошее преподношение контента.
Спасибо за поддержку!
И, Вам, за уроки.)
Сколько подписчиков было в тот время?
@@saidjonasrorov1721 около 20-50 тыс
хорошо и понятно обьясняеш, спасибо!
Thanks a lot, understood each details from it
Отличное видео! Спасибо!
Это просто супер канал! Уже посмотрел все видео в этом плэйлисте и начал по чуть-чуть кодить. Знания, как известно, без практики забываются (эти не исключение), поэтому приходится периодически возвращаться, чтобы решить проблему, и этот видос мне помог. Никак не мог понять, почему у меня не освобождается память, а вот оно) правда для решения моей проблемы (да и представленной в этом уроке) можно было бы просто использовать умные указатели (они будут дальше по курсу), но я про них чёт забыл :D В общем ОГРОМНОЕ СПАСИБО СЕРГЕЮ!
Комментарий благодарности и для поддержки автора, контент лучший!
Очень добросовестно. Хорошо бы текстовую версию, хотя бы исходник, и хорошо бы номер урока в названии ролика впереди поставить, а на заставке сместить влево, чтобы длительность ролика не забивала. Во избежание недоразумений - я очень высоко оцениваю, может это издержки отображения на моем ноутбуке утюба..
отличные уроки, как всегда лайк!
Спасибо за видео)
Спасибо!
Круто молодец! Продолжай!
Супер)) Спасибо
Спасибо!!!
Класс!
Всем рассказываю, какой Вы крутой!)
Спасибо
спасибо
"так само" і "а далі" гріє душу)
you are the best
все понятно)
Danke
Мне нравится монтаж видео
👏
Спасибо за видео!
И всё же, я не до конца понимаю, что делает слово virtual. В отдельных случаях вполне понятно, но что там "под капотом", до меня не доходит.
Очень подробно в #103 он объяснил. При чем в разных вариациях. Просмотри тот урок.
Не смотря на то, что честно проработал все предыдущие уроки, и то, что Сергей все оч. доходчиво объясняет, начинаю сдаваться.... смотрю, но почти нечего не понимаю, уж тем более не могу повторить сам.
У меня вопрос ко всем, кто наткнется на этот коментарий && кому_все_понятно: вы до этого другие языки освоили, или просто честно прорабатывая все уроки в данный момент четко понимаете как работают все детали синтаксиса данного урока?
что именно сложно понять?
Поздний ответ, конечно, но когда что-то не получается и ты чувствуешь дискомфорт, ты учишься. Надеюсь, у Вас всё получилось с программированием или другой областью, которую Вы для себя выбрали
@@Terlod хаха, нет)
У меня очередная 100500я попытка прогать на ++, под микроконтроллеры, и все идёт оооочень туго.
Однозначно нужен талант или склонность, иначе это одно мучение.
@@aleksandrdrobyshev7623сила види и правильный mindset, а ещё кайф от создания проектов
@@aleksandrdrobyshev7623 Как у вас дела, Вы еще программируете на с++ или сдались?
Подскажите, плиз, а почему переопределяя виртуальный деструктор, всё же, вызывается деструктор базового? Если переопределить виртуальный метод, то будет вызван только метод наследника, а базового нет.
Потому что как было сказано в предыдущих уроках, базовый класс является частью класса наследника (Утрирую: в памяти компьютера находится слепок базового класса потом идёт участок слепок класса наследника), и как нам гласит народная мудрость - Каков цикл жизни класса = вызывается конструктор, и потом когда класс отработал своё вызывается деструктор.
Схема вызова в данном уроке = Конструктор базового класса, конструктор класса наследника, деструктор класса наследника, деструктор базового класса.
@@petardo7783 : Бред пишите. Тогда прочему в прошлых уроках вызыванный метод Shoot() отрабатывал только у того объекта класса, через который данный метод был вызван. По вашей логике, вызывая Shoot у Submachinegun, отработал бы Shoot и у Gun и у Weapon, если бы не был чисто виртуальным.. Они же все "является частью класса наследника".
Я думаю логика для виртуальных деструкторов просто написана через костыли, вот и все.
@@arty1F Я думаю, Вы правы насчёт костылей. Скорее всего, слово virtual работает немного по-разному с обычными методами и с деструкторами.
@@Kokurorokuko похоже на то что это правда
Если я правильно все понял, то правильнее и надежнее всего виртуальные деструкторы и деструкторы override лучше всегда делать "по умолчанию" во всех классах при наследовании?
Автор - молодец! Согласен, знать о виртуализации деструкторов полезно, но вот делать так, думаю, плохая практика. Сначала мы пытаемся обмануть компилятор - заказать место в памяти для класса А, а создать класс В, который занимает в памяти места больше. А потом доблестно закрываем "косяк" компилятора, который сами же и спровоцировали. И еще возник вопрос: если мы объявим еще один экземпляр объекта А и операционная система нам вернет указатель на ячейку памяти, следующую за первым объектом А, то создав этот объект, мы затрем "хвост" В. Т.е от объекта В в памяти останется только часть А? Или я не правильно понимаю?
тоже интересно
неправильно.
Что ты курил? это фишка ООП
4:17 - Сергей про грамматическую ошибку, с кодом все как и должно быть....
Для тех у кого проблема с вызовом Деструктора : Не нужен никакой system("pause") или метод getchar() ..Заходите в свойства проекта Linker - General - System и Там меняете SubSystem на Console(Subsystem/Console).
Ещё можно вместо этого тупо убрать return 0;, а system("pause"); оставить.
@@coolomet если return 0; убрать, то main() у тебя ничего возвращать не будет, если конечно он у тебя определён с каким-либо типом(исключение - void). ну это если чисто доебаться из-за стандартов плюсов, а так можно делать что угодно, лишь бы работало
Я на каждый урок новый проект делаю, мне проще system("pause") написать, чем каждый раз в установках копаться.
@@rajinthunderkeg5005 напишу для тех, кто прочитает сейчас. Если в современном стандарте вы даже уберете return из int main() или вообще напишете void main(), то программа все равно будет возвращать код ошибки в консоль. Компилятору все равно, что вы там пишете. Даже если void (пустой тип), он все равно будет возвращать 0 при успешном выполнении или другое целочисленное значение (если есть ошибка), хотя обычно функции типа void так себя не ведут.
Спасибо за урок ну немного подправлю сам обьект удаляется ну вот если в этом обьекте будет динамический масив он останется
спасибо за столь ценные уроки! вопрос: player.Shoot(new Gun) деструктор Gun не вызывается. это значит, что происходит утечка памяти и так лучше не делать?
Новый объект создастся, его адрес будет передан в метод Shoot и после завершения метода - потеряется в пространстве и времени. После этого удалить объект будет невозможно.
@@user-qu5ch6rl4f спасибо, так всё-таки он останется в памяти, пока программа выполняется... не стоит так делать)
Было бы очень разумно, если в плюсах бы был OFF/ON-режим для авто-освобождения используемых ресурсов как в др. яз. В этом случае плюсы были бы еще более ценнее. Но сейчас "в ручную" все это "ворганить" не очень приятно и надежно. Для ручного контроля утечки памяти на плюсах все же требуется большая внимательность и бдительность.
В таком случае вам нужно перейти на c# :D
👍👍👍👍👍👏👏👏👌👌👌👌
В топ
up
А что мешает использовать вместо классической схемы, vector для выделения динамической памяти ?
там всё само очищается.
Нашёл ответ на этот вопрос?
@@maksvell_7778 походу нет(
56
У меня в Code::Blocks если этого не сделать, то компилятор пишет предупреждение: "warning: deleting object of abstract class type 'Gun' which has non-virtual destructor will cause undefined behavior [-Wdelete-non-virtual-dtor]|"
Через pragma думаю решиться проблема
Сегодня был вопрос про виртуальный деструктор от работодателя. Не смог ответить.
А почему тогда конструктор не надо переопределять?
Потому что если смотреть в сторону ООП, то каждый класс несёт свои данные. Классы наследники дополняют базовый класс (Расширяют функционал). Но можно из класса наследника устанавливать значения для базового класса.
потому что конструктор наследника не может вызваться, если не вызвался конструктор базового класса, так что переопределять и не нужно
ясненько, но не понятно только в какой момент вызываются деструкторы в случае объектов без динамического выделения памяти
деструкторьі вьізьіваются в тот же самьій момент. Более того, автор в данном уроке и описьівает конструктор и деструктор без вьіделения динамической памяти, а только симулирует вьіводом сообщения в консоль
4:19, опечатка на суть не влияет, даже не обратил внимание)
Ясно зачем это надо, не ясно только где логика в этом. Ведь такие манипуляции для методов мы делали как раз таки чтоб система понимала что надо вызвать один конкретный метод в каком либо классе наследников, а не все методы с похожим на званием вплоть до базового.
Блен, я понял это делается чтоб вызвать именно деструктор класса наследника, а уже он чтоб уничтожить объект своего класса вызывает деструктор базового и так по цепочке😳
@@pubgr862 так тогда бы вызывался вначале деструктор базового класса, а потом только наследника
Виртуальный и с реализацией? Вот тут совсем запутался...
Виртуальный, но не чисто виртуальный, поэтому и реализация вполне допустима
В чем проблема, если не вызывается деструктор?
Ну смотри, как говорилось в видео про динамическую память, если не освобождать эту память(сорь за тафтологию), то будет утечка памяти и будет перегружаться твоя оперативка
Lafy я понимаю это. Но пробдема в том что , что у меня не вызывается деструкиэтор.
у тебя просто наверное не настроено, у тебя диструктор выводиться после "нажмите любую клавишу чтобы продолжить..."
ну либо что-то не так делаешь)
так и есть , у многих такая проблема
Абсолютно не понимаю, как работает создание указателя типа А(ведь классы это типы данных со своими свойствами) выделяя для него динамическую память типа B. При чем тут B? Для меня эта запись выглядить как int *aptr = new char. Не логично да, ну так и тут непонятно как это вообще должно работать и где применятся.
По поводу применений было целых две урока (про ключевые слова virtual и override и абстрактные классы).
А указатель типа int на объект char не будет работать т.к. Int никакого отношения к char не имеет.
В нашем же примере класс А является родительским для класса В, поэтому всё логично и всё работает. Как в уроке, где мы создавали указатель типа Weapon и присваивали ему ссылку на объект класса Gun, например.
Тоесть,это деструктор класса A,который,вызывает деструктор B?
Нет. Это цепочка событий, создаётся конструктор базового класса, конструктор класса наследника, деструктор класса наследника, деструктор базового класса.
Спасибо за урок!
Спасибо
спасибо
Спасибо за урок!
Спасибо