Тело чистой виртуальной функции
{
public:
void f() = 0
{
do_something();
}
};
Примечательно, что некоторые компиляторы это хавают. В страуструпе не нашел ничего на эту тему. У него сказано, что для того, чтобы сделать класс абстрактным используются чистые виртуальные функции. Чистые виртуальные функции объявлены как void f() = 0; и их имеет смысл использовать для задания интерфейса, тогда, когда не возможно определить разумную её реализацию в базовом классе.
Например Shape::ratate() - не известно, как повернуть абстрактную фигуру.
Тем не менее у Страуструпа (если я не слепой) не указано ни то, что виртуальная функция может иметь тело, ни то, что виртуальная функция его иметь не может.
Скажите, пожалуйста, кто знает - может ли чистая виртуальная функция иметь тело?
Убедительная просьба аргументировать свой ответ, т.к. я сам, к примеру, считаю, что не может но аргументировать не могу: соответственно цена моим словам - ноль.
Скажите, пожалуйста, кто знает - может ли чистая виртуальная функция иметь тело?
Убедительная просьба аргументировать свой ответ, т.к. я сам, к примеру, считаю, что не может но аргументировать не могу: соответственно цена моим словам - ноль.
Может. Хотя и редко, но это бывает полезно:
http://www.gotw.ca/gotw/031.htm
http://m.habrahabr.ru/post/51398/
10.4 Abstract classes
[Note: a function declaration cannot provide both a pure-specifier and a definition
—end note] [Example:
struct C {
virtual void f() = 0 { }; // ill-formed
};
—end example]
10.4 Abstract classes
[Note: a function declaration cannot provide both a pure-specifier and a definition
—end note] [Example:
struct C {
virtual void f() = 0 { }; // ill-formed
};
—end example]
Здесь не говорится о том может или нет быть тело у чисто-виртуальной ф-ции.
Оставляю небольшую интригу, чтобы сами разобрались, что же имеется в виду в этой цитате из стандарта. :)
Оставляю небольшую интригу, чтобы сами разобрались, что же имеется в виду в этой цитате из стандарта. :)
А здесь нет и не было никакой интриги:D
Тогда, как ты понимаешь ту цитату, которую привел?
И как она соотносится с вопросом топика?
Ок, обозначу конкретно вопрос:
Скажите, пожалуйста, кто знает - может ли чистая виртуальная функция иметь тело?
Приведенная тобой цитата дает на него ответ?
Какой? Своими (русскими) словами, плз.
PS: Ах да, и все это при попутном ветре.
PS: Ах да, и все это при попутном ветре.
М-да... очень вольный (и неправильный) пересказ стандарта :D
Ты на русский можешь перевести цитату дословно?
Может, в процессе дословного перевода что-то прояснится? :)
P.S. Пока ты только вводишь людей в заблуждение неправильно трактуя стандарт.
Ключи в вольному и "неверному" переводу:
Подмазать соплями - определить тельце отдельно.
Повернуть ушами в правильном направлении - правильно позвать тельце.
Попутный ветер - поддержка со стороны компилятора(ов) и со стороны стандарта в настоящем и, что самое важное, в будущем.
Все выше перчисленные действия как правило выполняются в уже написанном гомнокоде с целью хотфикса и наличие их - верный стимул перепроектирования того творения где сие материализовалось.
Ключи в вольному и "неверному" переводу:
Подмазать соплями - определить тельце отдельно.
Повернуть ушами в правильном направлении - правильно позвать тельце.
Попутный ветер - поддержка со стороны компилятора(ов) и со стороны стандарта в настоящем и, что самое важное, в будущем.
Все выше перчисленные действия как правило выполняются в уже написанном гомнокоде с целью хотфикса и наличие их - верный стимул перепроектирования того творения где сие материализовалось.
Главное слово цитаты - объявление функции
и цитата говорит лишь о том, что нельзя при объявлении чисто-виртуальной ф-ции её здесь же определять, но ничего не говорится о том, что такая функция не может иметь тела.
При чем тут подмазать, повернуть ушами и т.п.?
При определении ф-ции отдельно от объявления - все согласно стандарту, никакого хака или как ты выражаешься "соплей" и "кручения ушей".
Что касается "попутного ветра", раз определено в стандарте, то и уважающие себя компиляторы поддерживают. Ну а про будущее это ты уже из пальца высосал.
Что касается гомнокода и перепроектирования - тоже высосано из пальца, детские страхи ничем не подтвержденные.
А теперь обратно к вопросу топика:
Скажите, пожалуйста, кто знает - может ли чистая виртуальная функция иметь тело?
Может.
Возражения есть? Уже нет?
Тогда вот это неверное утверждение зачеркиваем
Моя точка зрения такова: для того же чисто виртуального деструктора отдельно определенное тельце еще более-менее естественно так как для его вызова не нужно прилагать непонятных усилий с "правильным" вызовом.
И этого достаточно, т.к. деструктор - тоже функция, виртуальный деструктор - виртуальная функция, а чисто-виртуальный деструктор - чисто-виртуальная функция.
А для чисто виртуальной ф-ции наличие ее тела выглядит совершенно неестественно ибо она уже не является чисто виртуальной
Это ещё почему?
Может, ты не совсем правильно понимаешь, что значит "чисто-виртуальная" ?
таких хаков, клуждей, соплей и т.д. в коде быть не должно.
Почему хаков? С чего ты взял, что это хак?
Почему не должно быть?
А с чисто виртуальным деструктором более менее естественно ибо ими мы говорим этот класс не жизнеспособен в виде самостоятельного объекта, сразу вопрос этот класс с единственным мембером - деструктором или мы снова напортачили в иерархии? Возможно с единственным для некой "особенной" системы типизации - пусть, здесь не "важно" ибо разруливанием вызовов займется компилятор, а мы своего добились, отрапортовали об абстрактности класса.
Вот, и всего то. Опять же о наличии или об отсутствии тела не говорится.
А у нас уже есть ее дефолтовая реализация или пре/пост процессинг, право мы сказали что ее нет и она требует своего непосредственного вызова из наследников. Это конечно стимул к юзеру базового класса таки предоставить сию реализацию, однако он должен учитывать что возможно гдето там в недрах библиотеки есть нечто, что возможно придется периодически звать, причем это нечто объявлено несуществующим, если представлять код самодокументирующимся, без прилагающегося толмуда в трех томах.
Давай без тяги к преувеличению. "Толмуд в трех томах" - это строка комментария.
Хотя кое в чем с тобой согласен,- синтаксис хромает, но это общая проблема C++, как и operator++(int) и т.п. Но к самой возможности обладания чисто-виртуальной функцией тела отношения не имеет.
Другими словами, чисто-виртуальная ф-ция может иметь тело и это нормально, но вот описание этого факта в C++ не явно и только это плохо.
А если сие юзается только внутри библиотеки и юзеру ничего звать не нужно тогда почему сей сущности необходимо маскироваться под интерфейс?
Ошибка считать абстрактный класс тождеством интерфейсу.
Налицо некие противоречия, что естественно наталкивает на мысль об адекватности и чистоте полученной классовой иерархии.
Противоречие это порождено проведением тождества между абстрактным классом и интерфейсом, а это (в общем случае) разные вещи.
Что касается "адекватности и чистоте полученной классовой иерархии", то это несколько субъективно.
Меня, к примеру, "наталкивает на мысль об адекватности и чистоте полученной классовой иерархии" наличие protected. Хотя бывают моменты, когда он бывает нужен именно для чистоты и адекватности. Например, для обеспечения "абстрактности" базового класса объявлением его конструктора защищенным (protected).
а может кто либо привести ситуацию когда действительно необходимо тело в чистовиртуальной функции?
Из того что приводил Green.
http://www.gotw.ca/gotw/031.htm
Для второго случая так и не придумал ситуацию, где это действительно может быть необходимо. Третий использовал для целей отладки.
Огромное спасибо за разъяснения, мне действительно было очень интересно прояснить этот момент -- теперь все ясно.
Чисто-виртуальная функция может иметь тело.
Насчет использования конечно мое личное мнение .что все же прежде, чем его (тело) написать, стоит пойти подышать свежим воздухом, успокоиться, подумать о том, что все хорошо... Подумать о том, не взять ли лишний выходной отдохнуть... Потом подумать о чем-то умиротворяющем и лишь за тем снова задуматься, действительно ли это нужно, или это прореха архитектуры.
ЗЫ. Всех с наступившим!