LINUX.ORG.RU

Виртуальные функции в С++


0

0

При пере-объявлении/определении виртуальной функции в производном классе нужно указывать квалификатор virtual или нет?

Пример:

class A { virtual void f() {...} };
class B : public A { voif f() {...} };

или все же правильней так:
class B : public A { virtual voif f() {...} };

Ответ на: комментарий от annoynimous
Удивительно, но факт — ключевое слово virtual обязано присутствовать
 только в базовом классе. Если оно пропущено в производном классе, 
компилятор должен интерпретировать версию функции в производном классе 
так, словно она и там была объявлена виртуальной

Так что всегда пишите, чтобы потом вас потомки не прокляли

annoynimous ★★★★★
()

не нужно. Но прислушайся про потомков, ибо.

alex_custov ★★★★★
()

по стандарту не обязательно

Reset ★★★★★
()

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

const86 ★★★★★
()
Ответ на: комментарий от const86

> И чтобы virtual присутствовал в объявлении метода в дочернем классе.

А лучше бы не virtual, а override как java/c#. Сталкивался со случаем, когда virtual в производном классе стоял, а в сигнатуре был еще и const, что автоматически ввело новую виртуальную функцию в производный класс. При этом все собиралось и никаких warning не было.

kamre ★★★
()

Да пофигу, всё одно не скомпилится.

Miguel ★★★★★
()
Ответ на: комментарий от const86

>Недавно попалась на глаза другая подобная фича: поля класса инициализируются в том порядке, в каком объявлены, независимо от порядка перечисления в списке инициализации.

Ну так это не новость. Если поле при конструировании сгенерит исключение, необходимо вызвать деструкторы для остальных уже сконструированных. А как узнать кто из них уже создан? Это и определяется порядком инициализации.

devinull ★★
()
Ответ на: комментарий от const86

>Лучше бы стандарт требовал, чтобы этот порядок совпадал с объявлением

Зачем? Не так уж и часто этот порядок важен. g++ умеет на этот счёт выдавать warning и превращает его в error, если так уж хочется.

devinull ★★
()
Ответ на: комментарий от k_andy

Надо просто это прописать в файл который и так много куда включен.

devinull ★★
()
Ответ на: комментарий от l5k

> pch и --include рулят неимоверно.

Увы, мой компилятор так не может. :(

k_andy ★★★
()

В C# если не писать override компилятор матерится, что метод hides родителя. Жаль что gcc так не могет. Или могет?

lester_dev ★★★★★
()
Ответ на: комментарий от nozh

Блин, а я надеялся, может ключик какой секретный есть. Жаль :(

lester_dev ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.