Как стать автором
Обновить

Комментарии 43

НЛО прилетело и опубликовало эту надпись здесь
1,2 done, а на 3 как я понимаю у меня не хватит местных привелегий. хотя сейчас еще почитаю хелп внимательнее.
НЛО прилетело и опубликовало эту надпись здесь
честно говоря, попахивает занудством и чрезмерной академичностью, хотя с другой стороны полезно для проведения собеседования :)

вот если бы реальные примеры из жизни, где эти знания пригодятся…
На собеседованиях не это надо спрашивать (разве что в вопросе «на засыпку»). По поводу собеседований читать там — russian.joelonsoftware.com/Articles/Interviewing.html

а за примерами можно в гугл слазить — он их знает 8) тут же пища для размышлений дана…
у меня на одном из собеседований спрашивали что такое вирт. деструкторы.
У меня дважды спрашивали. И про виртуальный конструктор тоже ;)
А я уж переживал, что мою идею касательно «мифов» никто не подхватит :)

По поводу виртуальных конструкторов всё немного интереснее. Поэтому я думаю посвятить этому целую (хоть и не большую) статью.

А по поводу чистых виртуальных деструкторов, я думаю нужно сделать ударение на том, что они должны иметь тело…
>А по поводу чистых виртуальных деструкторов, я думаю нужно сделать ударение на том, что они должны иметь тело…

Вам наврали. С чего это вы взяли про «должны»? Сделайте класс со статическими функциями и используйте наздоровье (пример использования), и заодно «запечатанный» будет (в c# это static sealed подобие).
Ммм, совсем забыл, что можно напичкать класс одними статическими функциями. Потому что иначе — нет смысла писать чистый виртуальный деструктор без тела.
Ать, не интересно. Это опять таки не мифы. Люди, которые знают о существовании чисто виртуальных деструкторов с реализацией по умолчанию, знают также все те факты, что вы привели. Для большинства же людей хватает правила «Делайте деструктор базового класса виртуальным, если какой-нибудь из наследников данного класса будет удален полиморфно».

> Для чего нужен подобный чисто виртуальный деструктор? Это используется для того, чтобы сделать класс абстрактным, не создавая чисто виртуальных функций.

Правильно, очередной рудимент языка и способ попортить нервы на собеседованиях :)
Господи, когда же Вы наконец уйметесь?! =) Мифы, не мифы… Прицепились к названию, и упорно продолжаете твердить, что это всем известно. Я каждый день общаюсь в университете со студентами и со стопроцентной уверенностью заявляю Вам: «Не всем! Я и сам не так давно „развеял” для себя некоторые мифы».
Уймусь тогда, когда напишите нечто, совершенно ранее не изжеванное в многих источниках (pure virtual desctructor был у Майерса в More Exceptional C++ второй книге, извините за дотошность). Когда это обычная праздная информация, поданная с такой позиции — это не интересно :) В том же С++ множество неизведанных уголков, а предпочитают обсуждать одно и то же %)
Ну и студент — это не программист высокой квалификации (только если это не работающий студент).
Ну, по поводу «Статья расчитана на программистов средней и высокой квалификации», согласен, действительно перебор. Я намеренно в своих статьях неоднократно подчеркивал тот факт, что пишу для переходящих от начального уровня к среднему.
Естественно, что Вам неинтересно. Потому как Вы давно прошли данный этап изучения C++. Если Вы штудируете Мейерса, Саттера и Александреску на английском языке, то другие в это время в лучшем случае читают не лучшего IMHO качества, но почему-то безумно популярную книгу Дейтлов с плохим переводом.

Я писал не для таких, как Вы. И человек, который решил дополнить мою статью, видимо тоже. Если я для совсем начинающих захочу написать, что такое препроцессор, компилятор и компоновщик, и какие функции они выполняют, Вы тоже будете кричать, что это неинтересно и написано во всех книгах (кстати, на самом деле не во всех ;))?

Я по себе знаю, как трудно было искать подходящие книги, притом в печатном виде — это недешевое нынче удовольствие, а в электронном — все материалы в основном на английском. Может для кого-то английский и не проблема, но есть и такие, которые не смогут читать и понимать тексты на неродном языке.

Почему бы Вам не написать «незаезженную» статью по чистому C++, дабы показать хороший пример?
Убедили, книги действительно дорогое удовольствие. Хорошо, выберу что-нибудь интересное и напишу статью :)
ИМХО все что «неизведано» описано в стандарте или UB. Да и не так много того, что не обсуждалось по этому языку… а уж про рудименты — так триграфы вот это настоящий рудимент 8)
Ну все-таки не совсем все. Я не имел ввиду чисто академические уловки, вроде той, что изложена в этой статье, а скорее практическое применение. К примеру проектирование с использованием С++ и полиморфизма времени компиляции, и многое другое, что было освоено на личном опыте. Практика — это всегда интереснее и полезнее, нежели сферический конь в вакууме.
Вы считаете вирт деструкторы «академической уловкой»? или, конкретно что? я немного, признаться, не понял
НЛО прилетело и опубликовало эту надпись здесь
Ололо!
НЛО прилетело и опубликовало эту надпись здесь
Нет, это я показыавю, что Ваш коментарий кажется мне забавным:
Ну при чем тут Delphi, если топик про C++?
>Советую посмотреть, как виртуальные конструкторы реализованы в Delphi
это канал про анимэ, Вам не сюда, похоже…
У объектов Delphi и C++ есть коренная разница. Delphi — это, скорее, Java ;-)
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
простой вопрос — в чем разница между a->get(); и a.get(); и какой ближе делфи? а джаве? :-)
НЛО прилетело и опубликовало эту надпись здесь
Вообще говоря, это все условности. Вы так же правы, как и я. Если взять, скажем, наличие виртуальных и «обычных» функций — то Object Pascal ближе к C++, с другой стороны можно посчитать, что наличие «обычных» объектов в C++ роднит его с Jаva — этакая «сборка мусора» ;-)
Множественного наследования, кстати, в C++ тоже не было некоторое время.
Также определять можно и другие чисто виртуальные функции.
А зачем?
Затем, что абстрактный класс в С++ это не обязательно интерфейс. У него могут быть члены-данные, которыми можно оперировать из функций-членов, в том числе виртуальных, в том числе чисто виртуальных.
Вот мне и интересно, каким образом чисто виртуальные функции могут чем-то оперировать? Что, можно написать class K { int i; virtual void foo() = 0 { ++i; } }, и «=0» не будет обнулять тело функции, а только задавать абстрактность класса?
Именно так. =0 всего лишь означает, что функция должна быть перегружена в наследнике, однако не означает, что у неё не может быть тела.
НЛО прилетело и опубликовало эту надпись здесь
вы невнимательно читали: со слов «Почему надо писать именно с определением деструктора?»
НЛО прилетело и опубликовало эту надпись здесь
>Зачем писать "=0" если мы определяем тело?
я описывал именно [b]чисто виртуальный деструктор[/b]. и зачем это может понадобиться тоже указывал: читайте со слов «Для чего нужен подобный чисто виртуальный деструктор?»

>Или, зачем определять тело, если мы пишем "=0"?
И это я тоже указывал: читать со слов «Почему надо писать именно с определением деструктора?»

НЛО прилетело и опубликовало эту надпись здесь
В плане чистого виртуального деструктора ясно…

А если это просто чисто виртуальная функция (то бишь абстрактный метод), то в принципе тело его можно определить, чтобы заключить в него какую-то общую часть алгоритма, а в переопределенных версиях (в классах-потомках) вызывать его напрямую.
Я бы на вашем месте выделял неверные утверждения цветом, а не писал об истинности после. Сильно сбивает.
Спасибо за подробную статью, некоторых вещей не знал. Теперь знаю. (:

P.S. наЛСДеники — шикарно.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации