Спецификатор virtual при перекрытии функции
От: igna Россия  
Дата: 31.08.07 06:21
Оценка:
Используете ли вы спецификатор virtual при перекрытии функции:

class B {
    virtual void f();
};

class D : public B {
    virtual void f(); // <- здесь
};


Если последовательно использовать virtual в этом случае, то с первого взгляда, не просматривая базовые классы можно отличить виртуальные функции от невиртуальных; но не так удобно отличать первое объявление виртуальной функции от объявлений перекрывающих его. Если не использовать virtual, то наоборот. Поэтому с точки зрения самодокументирования программы счет 1:1.

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

То есть мое предварительное мнение таково, что использовать спецификатор virtual при перекрытии функции не нужно. Тем более без него короче.
Re: Спецификатор virtual при перекрытии функции
От: dip_2000 Россия  
Дата: 31.08.07 06:34
Оценка: +3
Если это соц опрос то ответ ДА, всегда.

I>но не так удобно отличать первое объявление виртуальной функции от объявлений перекрывающих его.

А в чем для вас принципиальная разница ?

I>То есть мое предварительное мнение таково, что использовать спецификатор virtual при перекрытии функции не нужно. Тем более без него короче.Вот это в программировании имхо вобще не аргумент!


Вобщем согласен с Джефри Элджером, который сказал, что если этот модификатор не писать каждый раз при объявлении функции, по всей цепочке, то однажды ваши коллеги не разобравшись как работает программа устроят погром в офисе
Re[2]: Спецификатор virtual при перекрытии функции
От: dip_2000 Россия  
Дата: 31.08.07 06:35
Оценка:
сорри
I>То есть мое предварительное мнение таково, что использовать спецификатор virtual при перекрытии функции не нужно. Тем более без него короче.Вот это в программировании имхо вобще не аргумент!
Читать как :
I>То есть мое предварительное мнение таково, что использовать спецификатор virtual при перекрытии функции не нужно.
Тем более без него короче.Вот это в программировании имхо вобще не аргумент!
Re: Спецификатор virtual при перекрытии функции
От: Аноним  
Дата: 31.08.07 06:49
Оценка:
Здравствуйте, igna, Вы писали:

I>То есть мое предварительное мнение таково, что использовать спецификатор virtual при перекрытии функции не нужно. Тем более без него короче.

Мое с точностью до наоборот

Чтобы было видно, что эта функция переопределена\может быть переопределена

P.S. Ключевого слова override не хватает
Re[2]: Спецификатор virtual при перекрытии функции
От: igna Россия  
Дата: 31.08.07 07:01
Оценка:
Здравствуйте, dip_2000, Вы писали:

_>Вобщем согласен с Джефри Элджером, который сказал, что если этот модификатор не писать каждый раз при объявлении функции, по всей цепочке, то однажды ваши коллеги не разобравшись как работает программа устроят погром в офисе


Это он где сказал?
Re: Спецификатор virtual при перекрытии функции
От: Roman Odaisky Украина  
Дата: 31.08.07 07:08
Оценка:
Здравствуйте, igna, Вы писали:

I>Используете ли вы спецификатор virtual при перекрытии функции:


Если наследоваться только от интерфейсов («make non-leaf classes abstract») и использовать NVI, таких проблем не будет.

Еще можно попробовать развить идею
Автор: Roman Odaisky
Дата: 05.06.07
о запихивании всех виртуальных функций в служебные классы, тогда проблема просто отпадет.
До последнего не верил в пирамиду Лебедева.
Re[2]: Спецификатор virtual при перекрытии функции
От: igna Россия  
Дата: 31.08.07 07:08
Оценка:
Здравствуйте, Аноним, Вы писали:

I>>То есть мое предварительное мнение таково, что использовать спецификатор virtual при перекрытии функции не нужно. Тем более без него короче.

А>Мое с точностью до наоборот

А>Чтобы было видно, что эта функция переопределена\может быть переопределена


Страуструп в своей книге не использует virtual при перекрытии.
Re[2]: Спецификатор virtual при перекрытии функции
От: igna Россия  
Дата: 31.08.07 07:12
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Если наследоваться только от интерфейсов («make non-leaf classes abstract») и использовать NVI, таких проблем не будет.


Перекрывать функции придется все-равно.
Re[3]: Спецификатор virtual при перекрытии функции
От: Аноним  
Дата: 31.08.07 07:12
Оценка:
Здравствуйте, igna, Вы писали:

А>>Чтобы было видно, что эта функция переопределена\может быть переопределена

I>Страуструп в своей книге не использует virtual при перекрытии.
Это не аргумент. В книге обычно примеры упрощены.

P.S. Страуструп вроде уже доктор\проффесор, а ты кто(да и я)? В общем, не надо тупо все копировать
Re[4]: Спецификатор virtual при перекрытии функции
От: igna Россия  
Дата: 31.08.07 07:39
Оценка:
Здравствуйте, Аноним, Вы писали:

А>P.S. Страуструп вроде уже доктор\проффесор, а ты кто(да и я)? В общем, не надо тупо все копировать


И Саттер профффесор. И Александреску вроде тоже. Порекомендуй книжку написанную не профффесором, а настоящим умственным пролетарием.
Re[3]: Спецификатор virtual при перекрытии функции
От: dip_2000 Россия  
Дата: 31.08.07 07:39
Оценка: 1 (1)
Здравствуйте, igna, Вы писали:

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


_>>Вобщем согласен с Джефри Элджером, который сказал, что если этот модификатор не писать каждый раз при объявлении функции, по всей цепочке, то однажды ваши коллеги не разобравшись как работает программа устроят погром в офисе


I>Это он где сказал?

В своей книге С++ for real programmers
Re[3]: Спецификатор virtual при перекрытии функции
От: Roman Odaisky Украина  
Дата: 31.08.07 07:45
Оценка:
Здравствуйте, igna, Вы писали:

RO>>Если наследоваться только от интерфейсов («make non-leaf classes abstract») и использовать NVI, таких проблем не будет.


I>Перекрывать функции придется все равно.


Воистину придется, но тогда неперекрытые виртуальные функции будут вызывать ошибки компилятора.
До последнего не верил в пирамиду Лебедева.
Re: Спецификатор virtual при перекрытии функции
От: IROV..  
Дата: 31.08.07 07:52
Оценка:
Здравствуйте, igna, Вы писали:

I>Используете ли вы спецификатор virtual при перекрытии функции:


I>
I>class B {
I>    virtual void f();
I>};

I>class D : public B {
I>    virtual void f(); // <- здесь
I>};
I>


I>Если последовательно использовать virtual в этом случае, то с первого взгляда, не просматривая базовые классы можно отличить виртуальные функции от невиртуальных; но не так удобно отличать первое объявление виртуальной функции от объявлений перекрывающих его. Если не использовать virtual, то наоборот. Поэтому с точки зрения самодокументирования программы счет 1:1.


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


I>То есть мое предварительное мнение таково, что использовать спецификатор virtual при перекрытии функции не нужно. Тем более без него короче.


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

я не волшебник, я только учусь!
Re: Спецификатор virtual при перекрытии функции
От: rg45 СССР  
Дата: 31.08.07 07:54
Оценка: +1
Здравствуйте, igna, Вы писали:

I>Если последовательно использовать virtual в этом случае, то с первого взгляда, не просматривая базовые классы можно отличить виртуальные функции от невиртуальных; но не так удобно отличать первое объявление виртуальной функции от объявлений перекрывающих его/


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

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


Я ведь о том, спецификатор virtual писать или нет, а ты о чем?
Re[2]: Спецификатор virtual при перекрытии функции
От: igna Россия  
Дата: 31.08.07 08:10
Оценка:
Здравствуйте, IROV.., Вы писали:

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


В стандарте никакого override нет.
Re[5]: Спецификатор virtual при перекрытии функции
От: Sergey Россия  
Дата: 31.08.07 08:11
Оценка:
> А>P.S. Страуструп вроде уже доктор\проффесор, а ты кто(да и я)? В общем, не надо тупо все копировать
>
> И Саттер профффесор. И Александреску вроде тоже.

Александреску — аспирантишко

> Порекомендуй книжку написанную не профффесором, а настоящим умственным пролетарием.


С++ for real programmers? Чиста от пролетария для пролетариев
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: Спецификатор virtual при перекрытии функции
От: MasterZiv СССР  
Дата: 31.08.07 08:14
Оценка:
igna пишет:
> Если последовательно использовать virtual в этом случае, то с первого
> взгляда, не просматривая базовые классы можно отличить виртуальные

Ну пишите вместо этого в дочернем классе override.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Спецификатор virtual при перекрытии функции
От: MasterZiv СССР  
Дата: 31.08.07 08:15
Оценка:
rg45 пишет:
> ИМХО, возможность слету отличать виртуальные функции от невиртуальных
> имеет бОльшую ценность. А когда вообще может оказаться полезным знание о
> том, объявлена ли функция впервые или перекрывается?

Да никакой ценности IMHO
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Спецификатор virtual при перекрытии функции
От: igna Россия  
Дата: 31.08.07 08:15
Оценка:
Здравствуйте, rg45, Вы писали:

R>ИМХО, возможность слету отличать виртуальные функции от невиртуальных имеет бОльшую ценность. А когда вообще может оказаться полезным знание о том, объявлена ли функция впервые или перекрывается?


Не возражаю, но хочу понять почему ни Страуструп, ни Саттер virtual при перекрытии не используют. Просто хотелось бы знать пару аргументов в пользу их стиля.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.