Виртуальный деструктор класса 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

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

  • @SimpleCodeIT
    @SimpleCodeIT  6 лет назад +47

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

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

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

    • @user-qe3lc6bk5c
      @user-qe3lc6bk5c Год назад

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

  • @gnot7900
    @gnot7900 11 месяцев назад +25

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

    • @user-ny4zk7gj7n
      @user-ny4zk7gj7n 3 месяца назад +2

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

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

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

  • @objectivetop3901
    @objectivetop3901 6 лет назад +88

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

  • @segars9604
    @segars9604 8 месяцев назад +5

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

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

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

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

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

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

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

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

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

  • @user-bc4vi6hl2f
    @user-bc4vi6hl2f 6 лет назад +11

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

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

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

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

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

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

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

  • @_mirai
    @_mirai 4 года назад +13

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

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

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

    • @SimpleCodeIT
      @SimpleCodeIT  6 лет назад +11

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

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

      И, Вам, за уроки.)

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

      Сколько подписчиков было в тот время?

    • @user-nz5sr5hj6i
      @user-nz5sr5hj6i Год назад

      @@saidjonasrorov1721 около 20-50 тыс

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

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

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

    Thanks a lot, understood each details from it

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

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

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

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

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

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

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

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

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

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

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

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

  • @seregapikulev9834
    @seregapikulev9834 4 года назад +3

    Спасибо!

  • @user-sf5zv4jc5v
    @user-sf5zv4jc5v 2 года назад

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

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

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

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

    Спасибо!!!

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

    Класс!

  • @tapirskiy
    @tapirskiy 4 года назад +4

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

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

    Спасибо

  • @user-kb6qd8rg4g
    @user-kb6qd8rg4g 4 года назад

    спасибо

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

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

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

    you are the best

  • @user-ck5ee4mo8b
    @user-ck5ee4mo8b 2 года назад

    все понятно)

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

    Danke

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

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

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

    👏

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

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

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

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

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

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

    • @user-or1hy4xz8u
      @user-or1hy4xz8u 2 года назад

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

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

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

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

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

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

      ​@@aleksandrdrobyshev7623сила види и правильный mindset, а ещё кайф от создания проектов

    • @user-mh8ii8jn8o
      @user-mh8ii8jn8o 4 месяца назад

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

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

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

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

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

    • @arty1F
      @arty1F 5 лет назад +8

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

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

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

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

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

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

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

  • @user-sp6ol3bc5k
    @user-sp6ol3bc5k 3 года назад +5

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

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

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

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

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

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

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

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

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

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

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

    • @user-qp5mu5tc8n
      @user-qp5mu5tc8n 7 месяцев назад +1

      @@rajinthunderkeg5005 напишу для тех, кто прочитает сейчас. Если в современном стандарте вы даже уберете return из int main() или вообще напишете void main(), то программа все равно будет возвращать код ошибки в консоль. Компилятору все равно, что вы там пишете. Даже если void (пустой тип), он все равно будет возвращать 0 при успешном выполнении или другое целочисленное значение (если есть ошибка), хотя обычно функции типа void так себя не ведут.

  • @user-md2zn1zj6b
    @user-md2zn1zj6b Год назад

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

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

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

    • @user-qu5ch6rl4f
      @user-qu5ch6rl4f Год назад +1

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

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

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

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

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

    • @amirbabaev7211
      @amirbabaev7211 10 месяцев назад +2

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

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

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

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

    В топ

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

    up

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

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

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

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

    • @user-ll5dg6zm8d
      @user-ll5dg6zm8d 2 года назад

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

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

    56

  • @user-jp4qb6br7k
    @user-jp4qb6br7k 3 года назад

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

    • @user-yy2hb1zg8p
      @user-yy2hb1zg8p Год назад

      Через pragma думаю решиться проблема

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • @GanjaRaider
    @GanjaRaider 10 месяцев назад +1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Абсолютно не понимаю, как работает создание указателя типа А(ведь классы это типы данных со своими свойствами) выделяя для него динамическую память типа B. При чем тут B? Для меня эта запись выглядить как int *aptr = new char. Не логично да, ну так и тут непонятно как это вообще должно работать и где применятся.

    • @theflameflare
      @theflameflare 7 месяцев назад

      По поводу применений было целых две урока (про ключевые слова virtual и override и абстрактные классы).
      А указатель типа int на объект char не будет работать т.к. Int никакого отношения к char не имеет.
      В нашем же примере класс А является родительским для класса В, поэтому всё логично и всё работает. Как в уроке, где мы создавали указатель типа Weapon и присваивали ему ссылку на объект класса Gun, например.

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

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

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

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

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

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

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

    Спасибо

  • @user-hb7er4ff9u
    @user-hb7er4ff9u 2 года назад

    спасибо

  • @Antonov_Ivan.
    @Antonov_Ivan. 6 месяцев назад

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

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

    Спасибо