Здравствуйте, <Аноним>, Вы писали:
А>P.S. Ключевого слова override не хватает
В VC8 есть.
Видимо, авторы компилятора решили не париться с разделением C++98 и C++CLI, и часть синтаксиса (не требующая дотнетовских фишек для реализации) из последнего доступна в первом.
Очень удобно!
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[3]: Спецификатор virtual при перекрытии функции
Здравствуйте, igna, Вы писали:
I>Здравствуйте, IROV.., Вы писали:
IRO>>Стараюсь всегда писать override тогда компилятор сам за мною следит.
I>В стандарте никакого override нет.
MSVC8.0 держит, и пока работаю на нем, буду пользоватся им, и ждать пополнения в стандарте такой фичи, очень хорошей!
для переносимости есть
# define override
я не волшебник, я только учусь!
Re[3]: Спецификатор virtual при перекрытии функции
Здравствуйте, igna, Вы писали:
I>Здравствуйте, Кодт, Вы писали:
К>>В VC8 есть.
I>У меня в VC++ 2005 Express нет, то есть override подсвечивается, но не компилируется. Какие-нибудь установки?
Так, на всякий случай, override ставишь там где нужно? Нужно после объявления функции:
void foo() override
{
}
З.Ы. Я, все-таки, это использовать не стал бы.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[3]: Спецификатор virtual при перекрытии функции
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, <Аноним>, Вы писали:
А>>P.S. Ключевого слова override не хватает
К>В VC8 есть. К>Видимо, авторы компилятора решили не париться с разделением C++98 и C++CLI, и часть синтаксиса (не требующая дотнетовских фишек для реализации) из последнего доступна в первом. К>Очень удобно!
Типа так:
#if _MSC_VER < 1400
#define override
#endif
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[3]: Спецификатор virtual при перекрытии функции
Здравствуйте, igna, Вы писали:
MZ>>Ну пишите вместо этого в дочернем классе override. I>Это какого компилятора расширение?
Ну можешь определить
#define override virtual
а иногда собирать проект с override переопределённым в ничто.
Хотя, ИМХО, это не особо нужно, так как вроде компиляторы умеют в подозрительном случае выдавать предупреждения.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Спецификатор virtual при перекрытии функции
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, igna, Вы писали:
MZ>>>Ну пишите вместо этого в дочернем классе override. I>>Это какого компилятора расширение?
E>Ну можешь определить
#define override virtual
а иногда собирать проект с override переопределённым в ничто. E>Хотя, ИМХО, это не особо нужно, так как вроде компиляторы умеют в подозрительном случае выдавать предупреждения.
Ыыыыыыыыыыыыыыыыыы!!!!
void foo() virtual
у тебя что это скомпилится?
я не волшебник, я только учусь!
Re[5]: Спецификатор virtual при перекрытии функции
Здравствуйте, IROV.., Вы писали:
IRO>у тебя что это скомпилится?
А ты пиши так: override void foo()
Правда будет несовместимо с хаком от MSVC, ну можешь тогда другое слово выбрать, скажем implement
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: Спецификатор virtual при перекрытии функции
Здравствуйте, igna, Вы писали:
I>Или overtual. А то еще с каким-нибудь хаком несовместимо будет.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: Спецификатор virtual при перекрытии функции
> S>С++ for real programmers? Чиста от пролетария для пролетариев > > Сейчас в амазоне посмотрел, этой книге скоро 10 лет. Там хоть шаблоны есть?
Насколько помню, есть. Я эту книжку не хвалю (для real programmers она ничего так, но спорных вещей там выше крыши.), просто не одни профессора книжки пишут.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Стараюсь писать, т.к. в этом случае ясно, что она может быть перекрыта другой функцией, либо может перекрывать сама другую.
Намного удобнее, чем искать описание базовых классов.
ИМХО, возможность при перекрытии функций опускать слово virtual — удобство весьма сомнительное, лучше бы его не было вовсе. Смотришь на функцию — если virtual есть, значит виртуальная, а если нет — лезь вверх по иерархии классов и выясняй.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[5]: Спецификатор virtual при перекрытии функции
Здравствуйте, igna, Вы писали:
RO>>Воистину придется, но тогда неперекрытые виртуальные функции будут вызывать ошибки компилятора.
I>Я ведь о том, спецификатор virtual писать или нет, а ты о чем?
Я о том, что в грамотно спроектированных классах вот этой проблемы вообще нет:
А вот если функции B::f и D::f по ошибке получают разные имена, ошибку эту можно скорее заметить, если virtual при перекрытии не используется; потому что функция в производном классе перестает быть виртуальной
До последнего не верил в пирамиду Лебедева.
Re[3]: Спецификатор virtual при перекрытии функции
Здравствуйте, igna, Вы писали:
I>Не возражаю, но хочу понять почему ни Страуструп, ни Саттер virtual при перекрытии не используют. Просто хотелось бы знать пару аргументов в пользу их стиля.
Возможный вариант — на virtual в этом случае полагаться опасно:
class Interface
{
. . .
virtual void doSomething() = 0;
. . .
};
/** @author SensibleDeveloper */class Implementation1: public Interface
{
. . .
virtual void doSomething(); // OK, это реализация виртуальной функции (потому что не = 0 и не в интерфейсе)
. . .
};
/** @author CarelessDeveloper */class Implementation2: public Interface
{
. . .
void doSomething(); // а это, надо полагать, обычная невиртуальная функция?
. . .
};
Для документированности можно еще что сделать:
#define VIRTUALS private
class Implementation: public Interface
{
public:
Interface();
. . .
VIRTUALS:
void doSomething();
. . .
private:
Member member_;
. . .
};
До последнего не верил в пирамиду Лебедева.
Re[2]: Спецификатор virtual при перекрытии функции
> ИМХО, возможность при перекрытии функций опускать слово virtual — удобство весьма сомнительное, лучше бы его не было вовсе. Смотришь на функцию — если virtual есть, значит виртуальная, а если нет — лезь вверх по иерархии классов и выясняй.
А какой толк от знания, что функция в наследнике виртуальная? Этого все равно не достаточно. Важно знать, что она виртуальная и переопределяет какую-то конкретную функцию базового класса. Так что в любом случае — лезь вверх по иерархии классов и выясняй. Вот если бы было отдельное ключевое слово override или что-нибудь подобное — другое дело.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[3]: Спецификатор virtual при перекрытии функции
Здравствуйте, Sergey, Вы писали:
S>...Вот если бы было отдельное ключевое слово override или что-нибудь подобное — другое дело.
Ну так какое дело? Заведи такое слово, если оно тебе реально нужно...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Спецификатор virtual при перекрытии функции
> S>...Вот если бы было отдельное ключевое слово override или что-нибудь подобное — другое дело. > > Ну так какое дело? Заведи такое слово, если оно тебе реально нужно...
Это ты про VC? Вообще дело полезное и нужно, MS тут молодцы. Но в одиночку от такого спецификатора проку не очень много. Желательно бы еще чтобы он был обязателен к написанию. А чтобы его введение не поломало существующий код — чтобы он был обязателен к написанию при некоторых условиях, заданных в базовом классе. Конкретно хотелось бы следующее — если базовый класс объявлен со спецификаором explicit, то в его наследниках override для переопределения виртуальных функций обязателен. Сильно помогло бы при рефакторинге. Ну и заодно все конструкторы в классе и его наследниках чтоб по умолчанию становились explicit (а это уже вроде в C++0x обещают).
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.