Re[2]: Спецификатор virtual при перекрытии функции
От: igna Россия  
Дата: 31.08.07 08:18
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Ну пишите вместо этого в дочернем классе override.


Это какого компилятора расширение?
Re[2]: Спецификатор virtual при перекрытии функции
От: Кодт Россия  
Дата: 31.08.07 08:28
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>P.S. Ключевого слова override не хватает


В VC8 есть.
Видимо, авторы компилятора решили не париться с разделением C++98 и C++CLI, и часть синтаксиса (не требующая дотнетовских фишек для реализации) из последнего доступна в первом.
Очень удобно!
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[3]: Спецификатор virtual при перекрытии функции
От: IROV..  
Дата: 31.08.07 08:30
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, IROV.., Вы писали:


IRO>>Стараюсь всегда писать override тогда компилятор сам за мною следит.


I>В стандарте никакого override нет.


MSVC8.0 держит, и пока работаю на нем, буду пользоватся им, и ждать пополнения в стандарте такой фичи, очень хорошей!

для переносимости есть
# define override

я не волшебник, я только учусь!
Re[3]: Спецификатор virtual при перекрытии функции
От: igna Россия  
Дата: 31.08.07 08:36
Оценка:
Здравствуйте, Кодт, Вы писали:

К>В VC8 есть.


У меня в VC++ 2005 Express нет, то есть override подсвечивается, но не компилируется. Какие-нибудь установки?
Re[4]: Спецификатор virtual при перекрытии функции
От: rg45 СССР  
Дата: 31.08.07 09:05
Оценка: 6 (1)
Здравствуйте, igna, Вы писали:

I>Здравствуйте, Кодт, Вы писали:


К>>В VC8 есть.


I>У меня в VC++ 2005 Express нет, то есть override подсвечивается, но не компилируется. Какие-нибудь установки?


Так, на всякий случай, override ставишь там где нужно? Нужно после объявления функции:
void foo() override
{
}


З.Ы. Я, все-таки, это использовать не стал бы.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[3]: Спецификатор virtual при перекрытии функции
От: rg45 СССР  
Дата: 31.08.07 09:32
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, <Аноним>, Вы писали:


А>>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 при перекрытии функции
От: Erop Россия  
Дата: 31.08.07 09:58
Оценка:
Здравствуйте, igna, Вы писали:

MZ>>Ну пишите вместо этого в дочернем классе override.

I>Это какого компилятора расширение?

Ну можешь определить
#define override virtual
а иногда собирать проект с override переопределённым в ничто.
Хотя, ИМХО, это не особо нужно, так как вроде компиляторы умеют в подозрительном случае выдавать предупреждения.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Спецификатор virtual при перекрытии функции
От: IROV..  
Дата: 31.08.07 10:25
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, igna, Вы писали:


MZ>>>Ну пишите вместо этого в дочернем классе override.

I>>Это какого компилятора расширение?

E>Ну можешь определить
#define override virtual
а иногда собирать проект с override переопределённым в ничто.

E>Хотя, ИМХО, это не особо нужно, так как вроде компиляторы умеют в подозрительном случае выдавать предупреждения.

Ыыыыыыыыыыыыыыыыыы!!!!

void foo() virtual


у тебя что это скомпилится?
я не волшебник, я только учусь!
Re[5]: Спецификатор virtual при перекрытии функции
От: Erop Россия  
Дата: 31.08.07 10:39
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>у тебя что это скомпилится?

А ты пиши так: override void foo()
Правда будет несовместимо с хаком от MSVC, ну можешь тогда другое слово выбрать, скажем implement
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: Спецификатор virtual при перекрытии функции
От: igna Россия  
Дата: 31.08.07 10:44
Оценка: +1 :)
Здравствуйте, Erop, Вы писали:

E>Правда будет несовместимо с хаком от MSVC, ну можешь тогда другое слово выбрать, скажем implement


Или overtual. А то еще с каким-нибудь хаком несовместимо будет.
Re[6]: Спецификатор virtual при перекрытии функции
От: igna Россия  
Дата: 31.08.07 10:48
Оценка: :))
Здравствуйте, Sergey, Вы писали:

S>С++ for real programmers? Чиста от пролетария для пролетариев


Сейчас в амазоне посмотрел, этой книге скоро 10 лет. Там хоть шаблоны есть?
Re[7]: virtual_impl или virtual_ovr или даже the_virtual (-)
От: Erop Россия  
Дата: 31.08.07 10:56
Оценка:
Здравствуйте, igna, Вы писали:

I>Или overtual. А то еще с каким-нибудь хаком несовместимо будет.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: Спецификатор virtual при перекрытии функции
От: Sergey Россия  
Дата: 31.08.07 11:21
Оценка:
> S>С++ for real programmers? Чиста от пролетария для пролетариев
>
> Сейчас в амазоне посмотрел, этой книге скоро 10 лет. Там хоть шаблоны есть?

Насколько помню, есть. Я эту книжку не хвалю (для real programmers она ничего так, но спорных вещей там выше крыши.), просто не одни профессора книжки пишут.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: Спецификатор virtual при перекрытии функции
От: alzt  
Дата: 31.08.07 12:21
Оценка:
Здравствуйте, igna, Вы писали:

Стараюсь писать, т.к. в этом случае ясно, что она может быть перекрыта другой функцией, либо может перекрывать сама другую.
Намного удобнее, чем искать описание базовых классов.
Re: Спецификатор virtual при перекрытии функции
От: rg45 СССР  
Дата: 31.08.07 12:42
Оценка:
Здравствуйте, igna, Вы писали:

ИМХО, возможность при перекрытии функций опускать слово virtual — удобство весьма сомнительное, лучше бы его не было вовсе. Смотришь на функцию — если virtual есть, значит виртуальная, а если нет — лезь вверх по иерархии классов и выясняй.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[5]: Спецификатор virtual при перекрытии функции
От: Roman Odaisky Украина  
Дата: 31.08.07 12:48
Оценка:
Здравствуйте, igna, Вы писали:

RO>>Воистину придется, но тогда неперекрытые виртуальные функции будут вызывать ошибки компилятора.


I>Я ведь о том, спецификатор virtual писать или нет, а ты о чем?


Я о том, что в грамотно спроектированных классах вот этой проблемы вообще нет:

А вот если функции B::f и D::f по ошибке получают разные имена, ошибку эту можно скорее заметить, если virtual при перекрытии не используется; потому что функция в производном классе перестает быть виртуальной

До последнего не верил в пирамиду Лебедева.
Re[3]: Спецификатор virtual при перекрытии функции
От: Roman Odaisky Украина  
Дата: 31.08.07 12:58
Оценка:
Здравствуйте, 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 при перекрытии функции
От: Sergey Россия  
Дата: 31.08.07 13:29
Оценка: +1
> ИМХО, возможность при перекрытии функций опускать слово virtual — удобство весьма сомнительное, лучше бы его не было вовсе. Смотришь на функцию — если virtual есть, значит виртуальная, а если нет — лезь вверх по иерархии классов и выясняй.

А какой толк от знания, что функция в наследнике виртуальная? Этого все равно не достаточно. Важно знать, что она виртуальная и переопределяет какую-то конкретную функцию базового класса. Так что в любом случае — лезь вверх по иерархии классов и выясняй. Вот если бы было отдельное ключевое слово override или что-нибудь подобное — другое дело.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[3]: Спецификатор virtual при перекрытии функции
От: Erop Россия  
Дата: 31.08.07 13:34
Оценка:
Здравствуйте, Sergey, Вы писали:

S>...Вот если бы было отдельное ключевое слово override или что-нибудь подобное — другое дело.


Ну так какое дело? Заведи такое слово, если оно тебе реально нужно...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Спецификатор virtual при перекрытии функции
От: Sergey Россия  
Дата: 31.08.07 14:00
Оценка:
> S>...Вот если бы было отдельное ключевое слово override или что-нибудь подобное — другое дело.
>
> Ну так какое дело? Заведи такое слово, если оно тебе реально нужно...

Это ты про VC? Вообще дело полезное и нужно, MS тут молодцы. Но в одиночку от такого спецификатора проку не очень много. Желательно бы еще чтобы он был обязателен к написанию. А чтобы его введение не поломало существующий код — чтобы он был обязателен к написанию при некоторых условиях, заданных в базовом классе. Конкретно хотелось бы следующее — если базовый класс объявлен со спецификаором explicit, то в его наследниках override для переопределения виртуальных функций обязателен. Сильно помогло бы при рефакторинге. Ну и заодно все конструкторы в классе и его наследниках чтоб по умолчанию становились explicit (а это уже вроде в C++0x обещают).
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.