Виртуальный деструктор класса C++. Что это такое. Наследование. Полиморфизм. Для начинающих

Поделиться
HTML-код
  • Опубликовано: 4 янв 2025

Комментарии • 110

  • @SimpleCodeIT
    @SimpleCodeIT  7 лет назад +48

    *Друзья, если вы решили изучать программирование и подписались на канал - рекомендую вам нажать колокольчик чтобы никогда не пропускать новые уроки!*

    • @bobrovskij100
      @bobrovskij100 5 лет назад +2

      Снимите, пожалуйста, видео о том, как разделять проект на файлы и как это всё подключать между собой, как подключать сторонние библиотеки, создавать свои, или просто как подключить готовый класс к проекту. Как пользоваться hex-редакторами и смаке.

    • @ЕвгенийБелков-о1л
      @ЕвгенийБелков-о1л 2 года назад

      Довод опыт да дар швед давно

  • @gnot7900
    @gnot7900 Год назад +41

    Тут остались только самые настойчивые и заинтересованные ребята. Спасибо за видео!

    • @Jessica_Cat-l1v
      @Jessica_Cat-l1v 10 месяцев назад +3

      🙃 не только! здесь началось самое прикольное! ООП гораздо веселее чем процедурный код😉. Только теперь появился настоящий интерес

    • @TurboGamasek228
      @TurboGamasek228 9 месяцев назад +2

      за 8 месяцев как продвинулись?
      это все базовая база, самое начало начал, так сказать

  • @objectivetop3901
    @objectivetop3901 7 лет назад +94

    ты просто лучший человек!!

  • @SimpleCodeIT
    @SimpleCodeIT  7 лет назад +16

    #виртуальныйдеструктор #ООП #SimpleCode #урокипрограммирования

  • @segars9604
    @segars9604 Год назад +6

    Спасибо за бесценный труд!)

  • @solomonchannel3573
    @solomonchannel3573 7 лет назад +16

    Как всегда на высоте и как всегда спасибо!

  • @SeshAlex
    @SeshAlex 6 лет назад +12

    Спасибо за урок! Жирнющий такой ЛАЙК!

  • @ILsanIsAdmin
    @ILsanIsAdmin 3 года назад +7

    Большое спасибо за урок! Смотрим всей студенческой группой)

  • @АндрейМиненко-ц3з
    @АндрейМиненко-ц3з 7 лет назад +11

    Спасибо за урок!

  • @TGrod
    @TGrod 3 года назад +3

    Это просто супер канал! Уже посмотрел все видео в этом плэйлисте и начал по чуть-чуть кодить. Знания, как известно, без практики забываются (эти не исключение), поэтому приходится периодически возвращаться, чтобы решить проблему, и этот видос мне помог. Никак не мог понять, почему у меня не освобождается память, а вот оно) правда для решения моей проблемы (да и представленной в этом уроке) можно было бы просто использовать умные указатели (они будут дальше по курсу), но я про них чёт забыл :D В общем ОГРОМНОЕ СПАСИБО СЕРГЕЮ!

  • @Плавчик-к9й
    @Плавчик-к9й 6 месяцев назад

    Сергей, вы просто лучший!!!!Благодаря вам я за 10 дней и просмотром 16-ти тем за день поднял перед экзаменом С++ с нуля!!!!!

  • @evgenyye
    @evgenyye 6 лет назад +5

    Как раз то что доктор прописал!!!

  • @vladalu9794
    @vladalu9794 6 лет назад +8

    Спасибо за хороший урок!

  • @proKaps
    @proKaps 6 лет назад +8

    Как всегда, очень хорошо.

  • @sagecat5696
    @sagecat5696 6 лет назад +73

    Очень странно, что так мало у Вас подписчиков, принимая во внимание качество контента. Скажу только вот что, удачи Вам.) Надеюсь в скором времени всё изменится в кардинально лучшую сторону. Ведь всё таки у Вас на порядок более хорошее преподношение контента.

  • @aln9391
    @aln9391 6 лет назад +18

    Очень добросовестно. Хорошо бы текстовую версию, хотя бы исходник, и хорошо бы номер урока в названии ролика впереди поставить, а на заставке сместить влево, чтобы длительность ролика не забивала. Во избежание недоразумений - я очень высоко оцениваю, может это издержки отображения на моем ноутбуке утюба..

  • @flepjack
    @flepjack 4 года назад +2

    Комментарий благодарности и для поддержки автора, контент лучший!

  • @_mirai
    @_mirai 5 лет назад +14

    просто коммент для продвижения!

  • @alivewel
    @alivewel Год назад +1

    Отличное видео! Спасибо!

  • @prost5514
    @prost5514 3 года назад +3

    Thanks a lot, understood each details from it

  • @TSaqo
    @TSaqo 3 года назад +1

    хорошо и понятно обьясняеш, спасибо!

  • @seregapikulev9834
    @seregapikulev9834 5 лет назад +3

    Спасибо!

  • @youjustillusion536
    @youjustillusion536 4 года назад

    отличные уроки, как всегда лайк!

  • @jewelkz
    @jewelkz 4 года назад +1

    Спасибо за видео)

  • @ЧеловекСвободный-е4н

    Круто молодец! Продолжай!

  • @aleksandrdrobyshev7623
    @aleksandrdrobyshev7623 4 года назад +5

    Не смотря на то, что честно проработал все предыдущие уроки, и то, что Сергей все оч. доходчиво объясняет, начинаю сдаваться.... смотрю, но почти нечего не понимаю, уж тем более не могу повторить сам.
    У меня вопрос ко всем, кто наткнется на этот коментарий && кому_все_понятно: вы до этого другие языки освоили, или просто честно прорабатывая все уроки в данный момент четко понимаете как работают все детали синтаксиса данного урока?

    • @ДмитрийНормов-ю6ц
      @ДмитрийНормов-ю6ц 2 года назад

      что именно сложно понять?

    • @Terlod
      @Terlod Год назад +1

      Поздний ответ, конечно, но когда что-то не получается и ты чувствуешь дискомфорт, ты учишься. Надеюсь, у Вас всё получилось с программированием или другой областью, которую Вы для себя выбрали

    • @aleksandrdrobyshev7623
      @aleksandrdrobyshev7623 Год назад +1

      @@Terlod хаха, нет)
      У меня очередная 100500я попытка прогать на ++, под микроконтроллеры, и все идёт оооочень туго.
      Однозначно нужен талант или склонность, иначе это одно мучение.

    • @РезиноваяГермания
      @РезиноваяГермания 11 месяцев назад

      @@aleksandrdrobyshev7623 Как у вас дела, Вы еще программируете на с++ или сдались?

    • @Larakara321
      @Larakara321 8 месяцев назад

      тоже уперся в этот вопрос. ответ примерно такой - автор приводит удаление объекта через указатель, у этого указателя есть свой(!) тип данных, в данном случае это базовый класс, если бы тип указателя и тип объекта бы совпадал - то проблемы бы не возникало, однако ситуации всякие бывают и тут вроде как одно из решений это сделать деструктор виртуальным, а иначе вызовется только деструктор базового класса, а наследуемый деструктор пролетает, хбз откуда и как так получается но вот так вот работает С++, типа слово virtual обязывает компилятор заглянуть в наследуемый класс

  • @mari_mick
    @mari_mick Год назад +1

    "так само" і "а далі" гріє душу)

  • @tapirskiy
    @tapirskiy 5 лет назад +4

    Всем рассказываю, какой Вы крутой!)

  • @vladimirdiadichev6140
    @vladimirdiadichev6140 7 лет назад +6

    Спасибо

  • @bama2619
    @bama2619 3 года назад

    Супер)) Спасибо

  • @HPMuwa
    @HPMuwa 5 лет назад +2

    Мне нравится монтаж видео

  • @photographer_nu
    @photographer_nu Год назад

    4:17 - Сергей про грамматическую ошибку, с кодом все как и должно быть....

  • @АндрейСайкин-з6р
    @АндрейСайкин-з6р 3 года назад +5

    Автор - молодец! Согласен, знать о виртуализации деструкторов полезно, но вот делать так, думаю, плохая практика. Сначала мы пытаемся обмануть компилятор - заказать место в памяти для класса А, а создать класс В, который занимает в памяти места больше. А потом доблестно закрываем "косяк" компилятора, который сами же и спровоцировали. И еще возник вопрос: если мы объявим еще один экземпляр объекта А и операционная система нам вернет указатель на ячейку памяти, следующую за первым объектом А, то создав этот объект, мы затрем "хвост" В. Т.е от объекта В в памяти останется только часть А? Или я не правильно понимаю?

  • @rustamibrahimli2113
    @rustamibrahimli2113 6 лет назад +2

    Для тех у кого проблема с вызовом Деструктора : Не нужен никакой system("pause") или метод getchar() ..Заходите в свойства проекта Linker - General - System и Там меняете SubSystem на Console(Subsystem/Console).

    • @coolomet
      @coolomet 6 лет назад

      Ещё можно вместо этого тупо убрать return 0;, а system("pause"); оставить.

    • @rajinthunderkeg5005
      @rajinthunderkeg5005 6 лет назад

      @@coolomet если return 0; убрать, то main() у тебя ничего возвращать не будет, если конечно он у тебя определён с каким-либо типом(исключение - void). ну это если чисто доебаться из-за стандартов плюсов, а так можно делать что угодно, лишь бы работало

    • @TheWladberlin
      @TheWladberlin 5 лет назад

      Я на каждый урок новый проект делаю, мне проще system("pause") написать, чем каждый раз в установках копаться.

  • @ivan_kirsanov
    @ivan_kirsanov Год назад

    Если я правильно все понял, то правильнее и надежнее всего виртуальные деструкторы и деструкторы override лучше всегда делать "по умолчанию" во всех классах при наследовании?

  • @osvab000
    @osvab000 4 года назад

    Класс!

  • @spark-5727
    @spark-5727 3 года назад

    you are the best

  • @elinaallakhverdova382
    @elinaallakhverdova382 5 лет назад +5

    Спасибо за видео!
    И всё же, я не до конца понимаю, что делает слово virtual. В отдельных случаях вполне понятно, но что там "под капотом", до меня не доходит.

    • @TheWladberlin
      @TheWladberlin 5 лет назад +1

      Очень подробно в #103 он объяснил. При чем в разных вариациях. Просмотри тот урок.

  • @Kibermasternet
    @Kibermasternet 6 лет назад +5

    Подскажите, плиз, а почему переопределяя виртуальный деструктор, всё же, вызывается деструктор базового? Если переопределить виртуальный метод, то будет вызван только метод наследника, а базового нет.

    • @petardo7783
      @petardo7783 6 лет назад +2

      Потому что как было сказано в предыдущих уроках, базовый класс является частью класса наследника (Утрирую: в памяти компьютера находится слепок базового класса потом идёт участок слепок класса наследника), и как нам гласит народная мудрость - Каков цикл жизни класса = вызывается конструктор, и потом когда класс отработал своё вызывается деструктор.
      Схема вызова в данном уроке = Конструктор базового класса, конструктор класса наследника, деструктор класса наследника, деструктор базового класса.

    • @arty1f
      @arty1f 5 лет назад +9

      @@petardo7783 : Бред пишите. Тогда прочему в прошлых уроках вызыванный метод Shoot() отрабатывал только у того объекта класса, через который данный метод был вызван. По вашей логике, вызывая Shoot у Submachinegun, отработал бы Shoot и у Gun и у Weapon, если бы не был чисто виртуальным.. Они же все "является частью класса наследника".
      Я думаю логика для виртуальных деструкторов просто написана через костыли, вот и все.

    • @Kokurorokuko
      @Kokurorokuko 3 года назад

      @@arty1f Я думаю, Вы правы насчёт костылей. Скорее всего, слово virtual работает немного по-разному с обычными методами и с деструкторами.

    • @almatytelecom1
      @almatytelecom1 3 года назад

      @@Kokurorokuko похоже на то что это правда

  • @АдамПрокопович
    @АдамПрокопович 3 года назад

    все понятно)

  • @ИгроманРоман-н2ш

    Спасибо за урок ну немного подправлю сам обьект удаляется ну вот если в этом обьекте будет динамический масив он останется

  • @std_void
    @std_void 2 года назад

    спасибо за столь ценные уроки! вопрос: player.Shoot(new Gun) деструктор Gun не вызывается. это значит, что происходит утечка памяти и так лучше не делать?

    • @Сергей-т9д7в
      @Сергей-т9д7в 2 года назад +1

      Новый объект создастся, его адрес будет передан в метод Shoot и после завершения метода - потеряется в пространстве и времени. После этого удалить объект будет невозможно.

    • @std_void
      @std_void 2 года назад

      @@Сергей-т9д7в спасибо, так всё-таки он останется в памяти, пока программа выполняется... не стоит так делать)

  • @sgimancs
    @sgimancs 5 лет назад

    Было бы очень разумно, если в плюсах бы был OFF/ON-режим для авто-освобождения используемых ресурсов как в др. яз. В этом случае плюсы были бы еще более ценнее. Но сейчас "в ручную" все это "ворганить" не очень приятно и надежно. Для ручного контроля утечки памяти на плюсах все же требуется большая внимательность и бдительность.

    • @amirbabaev7211
      @amirbabaev7211 Год назад +2

      В таком случае вам нужно перейти на c# :D

  • @annademidenko6356
    @annademidenko6356 6 лет назад +2

    👏

  • @wasony.126
    @wasony.126 4 года назад

    Danke

  • @smart_electronics_il
    @smart_electronics_il 4 года назад

    А что мешает использовать вместо классической схемы, vector для выделения динамической памяти ?
    там всё само очищается.

    • @maksvell_777
      @maksvell_777 4 года назад

      Нашёл ответ на этот вопрос?

    • @Роман-т5е6с
      @Роман-т5е6с 2 года назад

      @@maksvell_777 походу нет(

  • @LenTos1337
    @LenTos1337 6 лет назад +3

    А почему тогда конструктор не надо переопределять?

    • @petardo7783
      @petardo7783 6 лет назад +2

      Потому что если смотреть в сторону ООП, то каждый класс несёт свои данные. Классы наследники дополняют базовый класс (Расширяют функционал). Но можно из класса наследника устанавливать значения для базового класса.

    • @vladportnov3041
      @vladportnov3041 5 лет назад

      потому что конструктор наследника не может вызваться, если не вызвался конструктор базового класса, так что переопределять и не нужно

  • @axelka9342
    @axelka9342 3 года назад

    ясненько, но не понятно только в какой момент вызываются деструкторы в случае объектов без динамического выделения памяти

    • @eugeneshklyarevich4905
      @eugeneshklyarevich4905 2 года назад

      деструкторьі вьізьіваются в тот же самьій момент. Более того, автор в данном уроке и описьівает конструктор и деструктор без вьіделения динамической памяти, а только симулирует вьіводом сообщения в консоль

  • @apelsin3001
    @apelsin3001 4 года назад +1

    Сегодня был вопрос про виртуальный деструктор от работодателя. Не смог ответить.

  • @kaynsolo
    @kaynsolo 7 лет назад +2

    4:19, опечатка на суть не влияет, даже не обратил внимание)

  • @GanjaRaider
    @GanjaRaider Год назад +1

    Виртуальный и с реализацией? Вот тут совсем запутался...

    • @sleepyNovember_project
      @sleepyNovember_project 9 месяцев назад

      Виртуальный, но не чисто виртуальный, поэтому и реализация вполне допустима

  • @Рыззе
    @Рыззе 4 года назад

    У меня в Code::Blocks если этого не сделать, то компилятор пишет предупреждение: "warning: deleting object of abstract class type 'Gun' which has non-virtual destructor will cause undefined behavior [-Wdelete-non-virtual-dtor]|"

  • @Viamsupervadetvadens
    @Viamsupervadetvadens 7 лет назад +6

    up

  • @pubgr862
    @pubgr862 5 лет назад

    Ясно зачем это надо, не ясно только где логика в этом. Ведь такие манипуляции для методов мы делали как раз таки чтоб система понимала что надо вызвать один конкретный метод в каком либо классе наследников, а не все методы с похожим на званием вплоть до базового.

    • @pubgr862
      @pubgr862 5 лет назад +4

      Блен, я понял это делается чтоб вызвать именно деструктор класса наследника, а уже он чтоб уничтожить объект своего класса вызывает деструктор базового и так по цепочке😳

    • @vladportnov3041
      @vladportnov3041 5 лет назад +1

      @@pubgr862 так тогда бы вызывался вначале деструктор базового класса, а потом только наследника

  • @matveybolotov1374
    @matveybolotov1374 3 года назад

    В топ

  • @wasony.126
    @wasony.126 4 года назад

    👍👍👍👍👍👏👏👏👌👌👌👌

  • @kaisaryerdenbekov1588
    @kaisaryerdenbekov1588 6 лет назад

    56

  • @OriginNikOneMas
    @OriginNikOneMas 6 лет назад

    В чем проблема, если не вызывается деструктор?

    • @shaa8193
      @shaa8193 6 лет назад

      Ну смотри, как говорилось в видео про динамическую память, если не освобождать эту память(сорь за тафтологию), то будет утечка памяти и будет перегружаться твоя оперативка

    • @OriginNikOneMas
      @OriginNikOneMas 6 лет назад

      Lafy я понимаю это. Но пробдема в том что , что у меня не вызывается деструкиэтор.

    • @shaa8193
      @shaa8193 6 лет назад +1

      у тебя просто наверное не настроено, у тебя диструктор выводиться после "нажмите любую клавишу чтобы продолжить..."

    • @shaa8193
      @shaa8193 6 лет назад

      ну либо что-то не так делаешь)

    • @WebArchitector
      @WebArchitector 6 лет назад +1

      так и есть , у многих такая проблема

  • @user-fo9qs5nt1z
    @user-fo9qs5nt1z 6 лет назад +1

    Тоесть,это деструктор класса A,который,вызывает деструктор B?

    • @petardo7783
      @petardo7783 6 лет назад +3

      Нет. Это цепочка событий, создаётся конструктор базового класса, конструктор класса наследника, деструктор класса наследника, деструктор базового класса.

  • @pavelios3577
    @pavelios3577 6 лет назад +14

    Спасибо за урок!

  • @miroslavklyukovsky683
    @miroslavklyukovsky683 3 года назад +1

    Спасибо!!!

  • @ЯрославГоловко-ф6и
    @ЯрославГоловко-ф6и 4 года назад

    спасибо

  • @Antonov_Ivan.
    @Antonov_Ivan. Год назад

    Спасибо за урок!

  • @distraw1753
    @distraw1753 3 года назад

    Спасибо

  • @mulahivan
    @mulahivan 3 года назад

    Спасибо

  • @ВітяКоміссаров
    @ВітяКоміссаров 2 года назад

    спасибо