tag:blogger.com,1999:blog-10303035.post110975155130996224..comments2024-02-04T23:20:04.066+03:00Comments on Алёна C++: Чисто виртуальный деструкторAlenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.comBlogger25125tag:blogger.com,1999:blog-10303035.post-82823030413708112572012-12-09T11:08:32.430+04:002012-12-09T11:08:32.430+04:00Анонимный
странній вівод - если деструктор будет п...<b>Анонимный</b><br /><i>странній вівод - если деструктор будет просто виртуальній, то у наследников деструкторі же будут тоже виртуальнімі, разве нет? Для єтого не нужен чисто виртуальній деструктор.</i><br /><br />Это не вывод, просто комментарий. Достаточно, если деструктор будет просто виртуальным, да.Alenahttps://www.blogger.com/profile/09389124127364799922noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-6820737436551952142012-12-07T01:47:01.354+04:002012-12-07T01:47:01.354+04:00Итак, в итоге получается абстрактный базовый класс...Итак, в итоге получается абстрактный базовый класс, при наследовании от которого деструкторы будут виртуальными.<br />************<br />странній вівод - если деструктор будет просто виртуальній, то у наследников деструкторі же будут тоже виртуальнімі, разве нет? Для єтого не нужен чисто виртуальній деструктор. <br />PS: извините, я ставил бі себе раскладку дольше, чем єто писалAnonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-3287259621389668842012-04-02T15:40:48.674+04:002012-04-02T15:40:48.674+04:00Определение деструктора виртуальным - понятно нужн...Определение деструктора виртуальным - понятно нужно для предотвращения утечек памяти.<br /><br />Определение чисто виртуальному деструктору можно и не давать (если Вам специально это не требуется), потому как компилятор автоматически создает определение деструктора для каждого класса у которого нет деструктора.<br /><br />Так чем же обычный отличается от чистого? <br />Единственно отличие в классах в которых нет чисто виртуальных функций, а это почему то нужно. Тогда можно деструктор сделать чистым и все будет ок.<br /><br />Итого наличие виртуального деструктора важно, а вот чистота его не так существенна.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-10629487270663705732010-12-31T20:35:59.907+03:002010-12-31T20:35:59.907+03:00А зачем определение чисто виртульному деструктору?...А зачем определение чисто виртульному деструктору? И зачем чисто виртуальному деструктору поведение по-умолчанию? И, если оно ему таки нужно, зачем его делать чисто виртуальным, а не просто виртуальным?NightmareZhttps://www.blogger.com/profile/09252312025546820621noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-13350681603048150942010-12-31T20:02:19.835+03:002010-12-31T20:02:19.835+03:00NightmareZ
Буду весьма благодарен, если тыкните ме...<b>NightmareZ</b><br /><i>Буду весьма благодарен, если тыкните меня носом в нужный фрагмент текста.</i><br /><br />Вот это: <br />2. Why might you declare a pure virtual function and also write a definition (body)? Give as many reasons or situations as you can.<br /><br />Там дается три примера:<br />Для определения чисто виртуального деструктора. <br />Для определения поведения по умолчанию.<br />Workaround для плохой диагностики компилятора<br /><br />Там же приведены примеры.Alenahttps://www.blogger.com/profile/09389124127364799922noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-51417895306537399102010-12-31T02:31:19.326+03:002010-12-31T02:31:19.326+03:00Спасибо, конечно. Но, толи мне "повылазило&qu...Спасибо, конечно. Но, толи мне "повылазило" по новый год, толи что... я что-то в упор не вижу, зачем это НУЖНО :-)<br /><br />Буду весьма благодарен, если тыкните меня носом в нужный фрагмент текста.NightmareZhttps://www.blogger.com/profile/09252312025546820621noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-59543298899955380922010-12-31T01:33:58.477+03:002010-12-31T01:33:58.477+03:00NightmareZ
А зачем нужна в языке возможность опред...<b>NightmareZ</b><br /><i>А зачем нужна в языке возможность определять тело для чисто виртуальной функции?</i><br /><br />http://www.gotw.ca/gotw/031.htm<br /><br />;-)Alenahttps://www.blogger.com/profile/09389124127364799922noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-46361527604502028852010-12-26T05:46:38.184+03:002010-12-26T05:46:38.184+03:00А зачем нужна в языке возможность определять тело ...А зачем нужна в языке возможность определять тело для чисто виртуальной функции?NightmareZhttps://www.blogger.com/profile/09252312025546820621noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-3187562450776187142010-03-17T16:49:51.463+03:002010-03-17T16:49:51.463+03:00То, как ведет себя один компилятор в одной конкрет...<i>То, как ведет себя один компилятор в одной конкретной ситуации не есть истина в последней инстанции. Надо стандарт смотреть.</i><br /><br />Посмотрела, поправила, спасибо!Alenahttps://www.blogger.com/profile/09389124127364799922noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-45113919192098994862010-03-14T23:38:06.379+03:002010-03-14T23:38:06.379+03:002Darth Vader:
Т.е. объявление деструктора чисто-ви...<b>2Darth Vader:</b><br /><i>Т.е. объявление деструктора чисто-виртуальным не обязывает потомков к написанию деструктора, а всего лишь не дает возможности создать объект базового класа как абстрактного.</i><br /><br />То, как ведет себя один компилятор в одной конкретной ситуации не есть истина в последней инстанции. Надо стандарт смотреть.Alenahttps://www.blogger.com/profile/09389124127364799922noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-65825773059487040582010-03-14T23:08:22.813+03:002010-03-14T23:08:22.813+03:00Странно, я создал чисто-виртуальный деструктор в б...Странно, я создал чисто-виртуальный деструктор в базовом классе, а в дочерних их даже не объявил. Студия промолчала и нормально собрала и запустила проект.<br /><br />Т.е. объявление деструктора чисто-виртуальным не обязывает потомков к написанию деструктора, а всего лишь не дает возможности создать объект базового класа как абстрактного.Unknownhttps://www.blogger.com/profile/01553869690709228917noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-42199095639286557742009-10-26T19:16:02.219+03:002009-10-26T19:16:02.219+03:00Интересный вопрос. Кстати, объявить тело для таког...Интересный вопрос. Кстати, объявить тело для такого деструктора можно только в cpp-файле. Inline-декларация прямо в хеадере не прокатывает :<br /><br />virtual ~Foo() = 0 { } // compile-time error<br /><br />Проверял на gcc 4.2elwoodhttp://elwood.sunoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-31863555683477492012009-03-18T20:52:00.000+03:002009-03-18T20:52:00.000+03:00Почитал ребята я тут ваши комментарии и понял, что...Почитал ребята я тут ваши комментарии и понял, что плохо у нас преподается ООП. Что такое "чисто виртуальный метод" ? Это который = 0 в c++. Так давно уже сложились термины для такого случая - абстрактный метод. Классы, имеющие все абстрактные методы являют собой интерфейсы. В CSharp, в Java да и что там говорить - в самой нотации UML эти термины давно "узаконены". Огромная просьба не вводить новичков в дебри, а изъясняться на профессиональном языке. Мне то все равно, а вот начинающим разработчикам голову заморочите, они вообще ООП понимать не будут.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-74384880116393381832009-03-11T12:11:00.000+03:002009-03-11T12:11:00.000+03:00Вот эту мысль я не поняла Разобрался. Я просто пон...<I> Вот эту мысль я не поняла </I><BR/><BR/><BR/>Разобрался. Я просто понял фразу переопределить деструктор базового класса слишком буквально - как замену кода деструктора именно базового класса. По аналогии с переопределением метода, когда базовая реализация скрывается и подменяется наследником. Вы же под переопределением деструктора базового класса видимо имеете ввиду определение деструктора дочернего класса. Вобщем, я немного неправильно Вас понял :))Unknownhttps://www.blogger.com/profile/06006838659968807603noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-35122985041623290892009-03-11T11:33:00.000+03:002009-03-11T11:33:00.000+03:002Анонимный:Получается, что деструктор базового кла...<B>2Анонимный:</B><BR/><BR/><I>Получается, что деструктор базового класса можно переопределить(вернее будет сказать определить) только один раз.</I> <BR/><BR/>Да.<BR/><BR/><I>Если наследников несколько, они все будут использовать одно и тоже определение тела деструктора базового класса. </I><BR/><BR/>Да.<BR/><BR/><I>Так не проще ли тогда написать тело деструктора базового класса, при написании самого базового класса, не откладывая это дело до момента написания наследника?</I><BR/><BR/>Вот эту мысль я не поняла. Тело деструктору базового класса обязательно нужно в любом случае. Вне зависимости от того, будет ли деструктор переопределен в наследнике или нет. Причем даже если деструктор в наследнике переопределен, деструкторы всех базовых классов все равно вызываются по цепочке.Alenahttps://www.blogger.com/profile/09389124127364799922noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-56273965018810785152009-03-11T09:47:00.000+03:002009-03-11T09:47:00.000+03:00Получается, что деструктор базового класса можно п...Получается, что деструктор базового класса можно переопределить(вернее будет сказать определить) только один раз. Если наследников несколько, они все будут использовать одно и тоже определение тела деструктора базового класса. Так не проще ли тогда написать тело деструктора базового класса, при написании самого базового класса, не откладывая это дело до момента написания наследника?Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-31118176191285255442009-03-09T13:48:00.000+03:002009-03-09T13:48:00.000+03:00Для gcc (версия 4.2.4) не получилось переопределит...<I>Для gcc (версия 4.2.4) не получилось переопределить чисто виртуальный деструктор в наследнике.Подскажите синтаксис...</I><BR/><BR/><BR/>struct CBase<BR/>{<BR/> virtual ~CBase() = 0;<BR/>};<BR/><BR/>struct CDerived : public CBase<BR/>{<BR/> ~CDerived() { }<BR/><BR/>};<BR/><BR/><BR/>Ну и тело где-нибудь объявить.<BR/><BR/>CBase::~CBase()<BR/>{}Alenahttps://www.blogger.com/profile/09389124127364799922noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-82818846341881410592009-03-09T08:18:00.000+03:002009-03-09T08:18:00.000+03:00Для gcc (версия 4.2.4) не получилось переопределит...Для gcc (версия 4.2.4) не получилось переопределить чисто виртуальный деструктор в наследнике.Подскажите синтаксис...Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-41506945775533027672009-03-09T08:10:00.000+03:002009-03-09T08:10:00.000+03:00g++(версии 4.2.4) вообще не даёт переопределить д...g++(версии 4.2.4) вообще не даёт переопределить деструктор базового класса в наследнике...Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-1290133363300118412008-07-11T16:21:00.000+04:002008-07-11T16:21:00.000+04:00Виртуальные методы нужны для посылки сообщений от ...Виртуальные методы нужны для посылки сообщений от предка потомкам. Если предок никаких сообщений потомкам не передает (читай - у него отсутствуют виртуальные методы) то его ценность в иерархии нулевая. Зачем впихивать сущность только ради виртуального деструктора я не понимаю. Пример приведенный выше умным не назовешь. Именно по причине отсутствия связи между предком и потомками. Оператор присваивания, в данном случае, вообще непонятно зачем написан, это разные методы. Оператор "=" предка никак с операторами "=" потомков не связан. Так что пример фтопку, тема класса с единственным виртуальным методом - деструктором, да еще и чисто виртуальным не раскрыта.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-1168419430848851192007-01-10T11:57:00.000+03:002007-01-10T11:57:00.000+03:00---А Зачем Же Классу Вообще Быть Абстрактным, Если...---<BR/>А Зачем Же Классу Вообще Быть Абстрактным, Если У Него Doesn't Happen To Have Обычных Абстрактных Функций? Собственно, Это И Есть Показатель Абстрактности Класса - Наличие Виртуальных Функций, Которые Наследники<BR/>---<BR/>Если кратко, то, например, для корректной работы оператора присваивания.<BR/><BR/><BR/>---<BR/>Не Могу Придумать Реальной Задачи...<BR/>---<BR/>У Мейерса в "More effective C++" много на эту тему.<BR/>Наверно, вам лучше просто прочитать<BR/>"More effective C++" Item 33: Make non-leaf classes abstract.<BR/>Я лишь копи-пейстну итоговый пример.<BR/><I><BR/>class AbstractAnimal {<BR/>protected:<BR/> AbstractAnimal& operator=(const AbstractAnimal& rhs);<BR/><BR/>public:<BR/> virtual ~AbstractAnimal() = 0; // see below<BR/> ...<BR/><BR/>};<BR/><BR/>class Animal: public AbstractAnimal {<BR/>public:<BR/> Animal& operator=(const Animal& rhs);<BR/> ...<BR/>};<BR/><BR/>class Lizard: public AbstractAnimal {<BR/>public:<BR/> Lizard& operator=(const Lizard& rhs);<BR/> ...<BR/>};<BR/><BR/>class Chicken: public AbstractAnimal {<BR/>public:<BR/> Chicken& operator=(const Chicken& rhs);<BR/> ...<BR/>};<BR/></I>Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-1109760505535947152005-03-02T13:48:00.000+03:002005-03-02T13:48:00.000+03:00У меня нет наследников уровня ниже первого. И это ...У меня нет наследников уровня ниже первого. И это обычная ситуация для любой чисто виртуальной функции, не только для деструктора. Способа обязать переопределять какую-нибудь функцию дальше по иерархии мне в голову не приходит...Alenahttps://www.blogger.com/profile/09389124127364799922noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-1109758787160856742005-03-02T13:19:00.000+03:002005-03-02T13:19:00.000+03:00Но Это Не Решает Проблемы Для Наследников Уровня Н...Но Это Не Решает Проблемы Для Наследников Уровня Ниже Первого. Получается, Что Для Первого Наследника У Тебя Есть Механизм "Не Забыть", А Для Его Наследников - Уже Нет.Ivan Sagalaevhttps://www.blogger.com/profile/08658726720189436784noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-1109758598479996742005-03-02T13:16:00.000+03:002005-03-02T13:16:00.000+03:00В моем случае у класса есть другие чисто виртуальн...В моем случае у класса есть другие чисто виртуальные функции. А деструктор я сделала чисто виртуальным, чтобы не забывать его переопределять в наследниках. Эта иерархия классов занимается управлением ресурсами в игре. Соответственно, каждый класс должен корректно свои ресурсы освободить.Alenahttps://www.blogger.com/profile/09389124127364799922noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-1109758177461357212005-03-02T13:09:00.000+03:002005-03-02T13:09:00.000+03:00Меня Заинтересовало, А Зачем Вообще Делать Чисто В...Меня Заинтересовало, А Зачем Вообще Делать Чисто Виртуальный Деструктор, И Я Пошел Почитать По Ссылке:<br /><br />"If the class should be abstract (you want to prevent instantiating it) but it doesn't happen to have any other pure virtual functions..."<br /><br />А Зачем Же Классу Вообще Быть Абстрактным, Если У Него Doesn't Happen To Have Обычных Абстрактных Функций? Собственно, Это И Есть Показатель Абстрактности Класса - Наличие Виртуальных Функций, Которые Наследники _Должны_ Реализовать. Если Их Нет По Сути, То Зачем Приплетать Для Этой Цели Деструктор? Не Могу Придумать Реальной Задачи...<br /><br />P.S. И Если Уж На То Пошло, То Чтобы Просто Запретить Создание Класса, Достаточно За-Protect-ить Все Конструкторы...Ivan Sagalaevhttps://www.blogger.com/profile/08658726720189436784noreply@blogger.com