"Чистая виртуальность" и наличие определения вовсе не взаимоисключающие вещи. Чисто виртуальной функцию делают для того, чтобы гарантировать, что (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]
так кто прав, стандарт и студия его не поддержала в этом вопросе, или все же копия стандарта у меня не та?
Здравствуйте, Bell, Вы писали:
B>MS, как это часто бывает, решила немного улучшить стандарт
Таки для фанатов вроде есть опция строго по стандарту компилячить...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, <Аноним>, Вы писали:
А>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>>
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Erop, Вы писали:
B>>MS, как это часто бывает, решила немного улучшить стандарт E>Таки для фанатов вроде есть опция строго по стандарту компилячить...
Попробую ответить за фанатов: там есть опция компилячить без language extensions (/Za), что, ИМХО, не означает, что все будет компилячится по стандарту В частности вот этот пример
Здравствуйте, rg45, Вы писали:
R>Тут имеется ввиду, что нельзя в объявлении функции совмещать и то и другое. В объявлении можно оставить только pure-specifier, а определение сделать отдельно.
Честно говоря не совсем понятно по какой причине было введено подобное искусственное ограничение.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
CC>Честно говоря не совсем понятно по какой причине было введено подобное искусственное ограничение.
Абстрактные классы были добавлены во 2й версии CFront (в спешке перед выходом, поэтому и синтаксис =0, новое ключевое слово не прошло бы) вот что пишет автор о цели:
...дать пользователю возможность показать, что у некоторой виртуальной функции нет определения
Чисто виртуальными деструкторы обычно делают именно для (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