Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Тело чистой виртуальной функции

602
30 декабря 2009 года
KPI Student
265 / / 16.12.2006
Возник такой вопрос - что думает стандарт с++ на тему такого кода?

 
Код:
class A
{
public:
    void f() = 0
    {
        do_something();
    }
};


Примечательно, что некоторые компиляторы это хавают. В страуструпе не нашел ничего на эту тему. У него сказано, что для того, чтобы сделать класс абстрактным используются чистые виртуальные функции. Чистые виртуальные функции объявлены как void f() = 0; и их имеет смысл использовать для задания интерфейса, тогда, когда не возможно определить разумную её реализацию в базовом классе.
Например Shape::ratate() - не известно, как повернуть абстрактную фигуру.

Тем не менее у Страуструпа (если я не слепой) не указано ни то, что виртуальная функция может иметь тело, ни то, что виртуальная функция его иметь не может.

Скажите, пожалуйста, кто знает - может ли чистая виртуальная функция иметь тело?

Убедительная просьба аргументировать свой ответ, т.к. я сам, к примеру, считаю, что не может но аргументировать не могу: соответственно цена моим словам - ноль.
3
30 декабря 2009 года
Green
4.8K / / 20.01.2000
Цитата: KPI Student

Скажите, пожалуйста, кто знает - может ли чистая виртуальная функция иметь тело?

Убедительная просьба аргументировать свой ответ, т.к. я сам, к примеру, считаю, что не может но аргументировать не могу: соответственно цена моим словам - ноль.



Может. Хотя и редко, но это бывает полезно:
http://www.gotw.ca/gotw/031.htm
http://m.habrahabr.ru/post/51398/

260
30 декабря 2009 года
Ramon
1.1K / / 16.08.2003
ISO-IEC-14882 - 2003

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]

3
30 декабря 2009 года
Green
4.8K / / 20.01.2000
Цитата: Ramon
ISO-IEC-14882 - 2003

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]




Здесь не говорится о том может или нет быть тело у чисто-виртуальной ф-ции.
Оставляю небольшую интригу, чтобы сами разобрались, что же имеется в виду в этой цитате из стандарта. :)

260
30 декабря 2009 года
Ramon
1.1K / / 16.08.2003
Цитата: Green
Здесь не говорится о том может или нет быть тело у чисто-виртуальной ф-ции.
Оставляю небольшую интригу, чтобы сами разобрались, что же имеется в виду в этой цитате из стандарта. :)



А здесь нет и не было никакой интриги:D

3
31 декабря 2009 года
Green
4.8K / / 20.01.2000
Цитата: Ramon
А здесь нет и не было никакой интриги:D



Тогда, как ты понимаешь ту цитату, которую привел?
И как она соотносится с вопросом топика?

260
31 декабря 2009 года
Ramon
1.1K / / 16.08.2003
Дословно, и характеризующим код исходного поста как неадекватный конструктифф.
3
31 декабря 2009 года
Green
4.8K / / 20.01.2000
Цитата: Ramon
Дословно, и характеризующим код исходного поста как неадекватный конструктифф.



Ок, обозначу конкретно вопрос:

Цитата: KPI Student

Скажите, пожалуйста, кто знает - может ли чистая виртуальная функция иметь тело?


Приведенная тобой цитата дает на него ответ?
Какой? Своими (русскими) словами, плз.

260
31 декабря 2009 года
Ramon
1.1K / / 16.08.2003
Чисто виртуальная - не может, а если подмазать соплями и повернуть ушами в правильном направлении то получится эффект от подмазывания соплями и поворота ушами в правильном направлении, однако надо ли автору темы знать о таких кручениях ушами и техниках подмазывания?

PS: Ах да, и все это при попутном ветре.
3
31 декабря 2009 года
Green
4.8K / / 20.01.2000
Цитата: Ramon
Чисто виртуальная - не может, а если подмазать соплями и повернуть ушами в правильном направлении то получится эффект от подмазывания соплями и поворота ушами в правильном направлении, однако надо ли автору темы знать о таких кручениях ушами и техниках подмазывания?

PS: Ах да, и все это при попутном ветре.


М-да... очень вольный (и неправильный) пересказ стандарта :D
Ты на русский можешь перевести цитату дословно?
Может, в процессе дословного перевода что-то прояснится? :)

P.S. Пока ты только вводишь людей в заблуждение неправильно трактуя стандарт.

260
31 декабря 2009 года
Ramon
1.1K / / 16.08.2003
Дословный перевод: Объявление ф-ции не может одновременно предоставлять спецификатор "целомудренности":D и определение.

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

Все выше перчисленные действия как правило выполняются в уже написанном гомнокоде с целью хотфикса и наличие их - верный стимул перепроектирования того творения где сие материализовалось.
3
31 декабря 2009 года
Green
4.8K / / 20.01.2000
Цитата: Ramon
Дословный перевод: Объявление ф-ции не может одновременно предоставлять спецификатор "целомудренности":D и определение.

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

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



Главное слово цитаты - объявление функции
и цитата говорит лишь о том, что нельзя при объявлении чисто-виртуальной ф-ции её здесь же определять, но ничего не говорится о том, что такая функция не может иметь тела.

При чем тут подмазать, повернуть ушами и т.п.?
При определении ф-ции отдельно от объявления - все согласно стандарту, никакого хака или как ты выражаешься "соплей" и "кручения ушей".
Что касается "попутного ветра", раз определено в стандарте, то и уважающие себя компиляторы поддерживают. Ну а про будущее это ты уже из пальца высосал.

Что касается гомнокода и перепроектирования - тоже высосано из пальца, детские страхи ничем не подтвержденные.

А теперь обратно к вопросу топика:

Цитата: KPI Student

Скажите, пожалуйста, кто знает - может ли чистая виртуальная функция иметь тело?


Может.
Возражения есть? Уже нет?
Тогда вот это неверное утверждение зачеркиваем

Цитата: Ramon
Чисто виртуальная - не может

260
31 декабря 2009 года
Ramon
1.1K / / 16.08.2003
Моя точка зрения такова: для того же чисто виртуального деструктора отдельно определенное тельце еще более-менее естественно так как для его вызова не нужно прилагать непонятных усилий с "правильным" вызовом. А для чисто виртуальной ф-ции наличие ее тела выглядит совершенно неестественно ибо она уже не является чисто виртуальной, а посему это явная кандидатура на наложение заплатки в стандарте. В среднесрочной перспективе данное решение в виде некого фикса - жизнеспособно, а вот в долгосрочной таких хаков, клуждей, соплей и т.д. в коде быть не должно.
3
31 декабря 2009 года
Green
4.8K / / 20.01.2000
Цитата: Ramon

Моя точка зрения такова: для того же чисто виртуального деструктора отдельно определенное тельце еще более-менее естественно так как для его вызова не нужно прилагать непонятных усилий с "правильным" вызовом.


И этого достаточно, т.к. деструктор - тоже функция, виртуальный деструктор - виртуальная функция, а чисто-виртуальный деструктор - чисто-виртуальная функция.

Цитата: Ramon

А для чисто виртуальной ф-ции наличие ее тела выглядит совершенно неестественно ибо она уже не является чисто виртуальной


Это ещё почему?
Может, ты не совсем правильно понимаешь, что значит "чисто-виртуальная" ?

Цитата: Ramon

таких хаков, клуждей, соплей и т.д. в коде быть не должно.


Почему хаков? С чего ты взял, что это хак?
Почему не должно быть?

260
31 декабря 2009 года
Ramon
1.1K / / 16.08.2003
Чисто виртуальная ф-ция это требование к наследникам предоставить ее реализацию. А у нас уже есть ее дефолтовая реализация или пре/пост процессинг, право мы сказали что ее нет и она требует своего непосредственного вызова из наследников. Это конечно стимул к юзеру базового класса таки предоставить сию реализацию, однако он должен учитывать что возможно гдето там в недрах библиотеки есть нечто, что возможно придется периодически звать, причем это нечто объявлено несуществующим, если представлять код самодокументирующимся, без прилагающегося толмуда в трех томах. А если сие юзается только внутри библиотеки и юзеру ничего звать не нужно тогда почему сей сущности необходимо маскироваться под интерфейс? Налицо некие противоречия, что естественно наталкивает на мысль об адекватности и чистоте полученной классовой иерархии.

А с чисто виртуальным деструктором более менее естественно ибо ими мы говорим этот класс не жизнеспособен в виде самостоятельного объекта, сразу вопрос этот класс с единственным мембером - деструктором или мы снова напортачили в иерархии? Возможно с единственным для некой "особенной" системы типизации - пусть, здесь не "важно" ибо разруливанием вызовов займется компилятор, а мы своего добились, отрапортовали об абстрактности класса.
3
31 декабря 2009 года
Green
4.8K / / 20.01.2000
Цитата: Ramon
Чисто виртуальная ф-ция это требование к наследникам предоставить ее реализацию.


Вот, и всего то. Опять же о наличии или об отсутствии тела не говорится.

Цитата: Ramon

А у нас уже есть ее дефолтовая реализация или пре/пост процессинг, право мы сказали что ее нет и она требует своего непосредственного вызова из наследников. Это конечно стимул к юзеру базового класса таки предоставить сию реализацию, однако он должен учитывать что возможно гдето там в недрах библиотеки есть нечто, что возможно придется периодически звать, причем это нечто объявлено несуществующим, если представлять код самодокументирующимся, без прилагающегося толмуда в трех томах.


Давай без тяги к преувеличению. "Толмуд в трех томах" - это строка комментария.
Хотя кое в чем с тобой согласен,- синтаксис хромает, но это общая проблема C++, как и operator++(int) и т.п. Но к самой возможности обладания чисто-виртуальной функцией тела отношения не имеет.
Другими словами, чисто-виртуальная ф-ция может иметь тело и это нормально, но вот описание этого факта в C++ не явно и только это плохо.

Цитата: Ramon

А если сие юзается только внутри библиотеки и юзеру ничего звать не нужно тогда почему сей сущности необходимо маскироваться под интерфейс?


Ошибка считать абстрактный класс тождеством интерфейсу.

Цитата: Ramon

Налицо некие противоречия, что естественно наталкивает на мысль об адекватности и чистоте полученной классовой иерархии.


Противоречие это порождено проведением тождества между абстрактным классом и интерфейсом, а это (в общем случае) разные вещи.

Что касается "адекватности и чистоте полученной классовой иерархии", то это несколько субъективно.
Меня, к примеру, "наталкивает на мысль об адекватности и чистоте полученной классовой иерархии" наличие protected. Хотя бывают моменты, когда он бывает нужен именно для чистоты и адекватности. Например, для обеспечения "абстрактности" базового класса объявлением его конструктора защищенным (protected).

1
31 декабря 2009 года
kot_
7.3K / / 20.01.2000
а может кто либо привести ситуацию когда действительно необходимо тело в чистовиртуальной функции? В каких ситуациях это может использоваться? Потому что я понимаю например что это быть может - но затрудняюсь определить когда это стоит использовать.
288
31 декабря 2009 года
nikitozz
1.2K / / 09.03.2007
Цитата:

а может кто либо привести ситуацию когда действительно необходимо тело в чистовиртуальной функции?



Из того что приводил Green.
http://www.gotw.ca/gotw/031.htm

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

602
02 января 2010 года
KPI Student
265 / / 16.12.2006
Сколько всего... Не ожидал такого, да еще и 31-го числа :)

Огромное спасибо за разъяснения, мне действительно было очень интересно прояснить этот момент -- теперь все ясно.

Чисто-виртуальная функция может иметь тело.

Насчет использования конечно мое личное мнение .что все же прежде, чем его (тело) написать, стоит пойти подышать свежим воздухом, успокоиться, подумать о том, что все хорошо... Подумать о том, не взять ли лишний выходной отдохнуть... Потом подумать о чем-то умиротворяющем и лишь за тем снова задуматься, действительно ли это нужно, или это прореха архитектуры.

ЗЫ. Всех с наступившим!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог