определение чисто виртуальных функций
От: Аноним  
Дата: 08.04.08 15:03
Оценка:
Давно,читая ветку http://www.rsdn.ru/Forum/?mid=231923
Автор: Павел Кузнецов
Дата: 03.04.03
, видел сообщение

"Чистая виртуальность" и наличие определения вовсе не взаимоисключающие вещи. Чисто виртуальной функцию делают для того, чтобы гарантировать, что (1) она будет обязательно реализована в одном из наследников и что (2) класс будет абстрактным..."

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


class base
{
virtual void abstract()=0
 {
   MessageBox(NULL,"pure virtual","",MB_OK);   
 }
}
class derived: public base
{
   void abstract()
  {
      base::abstract();//все ок, меседжбокс виден...
   }
}


к чему это я...открыл в доказательство стандарт, а там:

10.4/2 (С99)

[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]



так кто прав, стандарт и студия его не поддержала в этом вопросе, или все же копия стандарта у меня не та?
Re: определение чисто виртуальных функций
От: Bell Россия  
Дата: 08.04.08 15:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>так кто прав, стандарт и студия его не поддержала в этом вопросе, или все же копия стандарта у меня не та?


MS, как это часто бывает, решила немного улучшить стандарт
Чтобы помирить студию и стандарт, вынеси определение из тела класса:

class base
{
protected:
virtual void abstract()=0;
};

void base::abstract() 
{
//...
}
Любите книгу — источник знаний (с) М.Горький
Re: определение чисто виртуальных функций
От: Roman Odaisky Украина  
Дата: 08.04.08 17:18
Оценка:
Здравствуйте, Аноним, Вы писали:

А>так кто прав, стандарт и студия его не поддержала в этом вопросе, или все же копия стандарта у меня не та?


Во-первых, по стандарту можно так:
class Base
{
    virtual void f() = 0;
};

void Base::f()
{
    . . .
}

Во-вторых, MSVS — хороший промышленный компилятор, но по вопросам соответствия стандарту точный ответ (и то не всегда :-) даст только Comeau.
До последнего не верил в пирамиду Лебедева.
Re[2]: определение чисто виртуальных функций
От: Erop Россия  
Дата: 08.04.08 19:33
Оценка:
Здравствуйте, Bell, Вы писали:

B>MS, как это часто бывает, решила немного улучшить стандарт

Таки для фанатов вроде есть опция строго по стандарту компилячить...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: определение чисто виртуальных функций
От: rg45 СССР  
Дата: 08.04.08 22:48
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>10.4/2 (С99)

А>

А>[Note: a function declaration cannot provide both a pure-specifier and a definition...

А>так кто прав, стандарт и студия его не поддержала в этом вопросе, или все же копия стандарта у меня не та?

Тут имеется ввиду, что нельзя в объявлении функции совмещать и то и другое. В объявлении можно оставить только pure-specifier, а определение сделать отдельно.
... << RSDN@Home 1.2.0 alpha rev. 787>>
--
Справедливость выше закона. А человечность выше справедливости.
Re[3]: определение чисто виртуальных функций
От: Bell Россия  
Дата: 09.04.08 06:39
Оценка:
Здравствуйте, Erop, Вы писали:

B>>MS, как это часто бывает, решила немного улучшить стандарт

E>Таки для фанатов вроде есть опция строго по стандарту компилячить...

Попробую ответить за фанатов: там есть опция компилячить без language extensions (/Za), что, ИМХО, не означает, что все будет компилячится по стандарту В частности вот этот пример
struct test
{
   virtual void abstract() = 0 {};
};

компилится с /Za.
Любите книгу — источник знаний (с) М.Горький
Re[2]: определение чисто виртуальных функций
От: CreatorCray  
Дата: 09.04.08 07:57
Оценка: +1
Здравствуйте, rg45, Вы писали:

R>Тут имеется ввиду, что нельзя в объявлении функции совмещать и то и другое. В объявлении можно оставить только pure-specifier, а определение сделать отдельно.

Честно говоря не совсем понятно по какой причине было введено подобное искусственное ограничение.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[3]: определение чисто виртуальных функций
От: gear nuke  
Дата: 18.06.08 12:34
Оценка: 3 (1)
Здравствуйте, CreatorCray, Вы писали:

CC>Честно говоря не совсем понятно по какой причине было введено подобное искусственное ограничение.


Абстрактные классы были добавлены во 2й версии CFront (в спешке перед выходом, поэтому и синтаксис =0, новое ключевое слово не прошло бы) вот что пишет автор о цели:

...дать пользователю возможность показать, что у некоторой виртуальной функции нет определения

. Это немного расходится с (2)
Автор: Павел Кузнецов
Дата: 03.04.03
, в частности с

Чисто виртуальными деструкторы обычно делают именно для (2). Т.е., если, например, в классе больше виртуальных функций нет, но хочется, чтобы класс был абстрактным.

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

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


Думаю, искусственно ничего не вводилось, из-за спешки не продумали все варианты с точки зрения удобства, в результате (n2606.pdf) имеем что и тогда.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.