Ошибки, баги, вопросы - страница 3660

 

Сегодня

 
override виртуального метода без прописывания virtual - это нормально?
class A
{
public:  
  virtual void f() {}
};

class B : public A
{
public:
  /* virtual */void f() override {} // virtual не прописан - нормально?
};
 
fxsaber #:
override виртуального метода без прописывания virtual - это нормально?

Смотрите этот пост и 2 предыдущих

https://www.mql5.com/ru/forum/1111/page3307#comment_45894972

 
Vladislav Boyko #:

Смотрите этот пост и 2 предыдущих

https://www.mql5.com/ru/forum/1111/page3307#comment_45894972

Спасибо, прочел. Но так и не понял, почему отсутствие virtual разрешается.

 
fxsaber # :

Спасибо, прочел. Но так и не понял, почему отсутствие virtual разрешается.

«f» уже является виртуальным из базового класса.

 
Igor Zakharev #:
Всем привет. Такой вопрос есть. Кто-нибудь пытался синхронизировать время из Market Watch с таймером советника, что бы секунды ровно шли? Актуально для панелей например.

А в теории это разве возможно? Как я понял, время от сервера транслируется вместе с котировкой, а значит есть транзакционные задержки, которые нестабильны.

 
fxsaber #:

Спасибо, прочел. Но так и не понял, почему отсутствие virtual разрешается.

Метод попадает в таблицу виртуальных функций при первом объявлении его с ключевым словом virtual. Далее метод остается виртуальным не зависимо от того, указываете ли вы virtual в производных классах. Вы не можете "убрать" метод из таблицы виртуальных функций, вы лишь можете запретить дальнейшее переопределение с попощью final.

После того обсуждения я никогда не указываю virtual при переопределении метода, но я всегда обязательно указываю override. Прошло больше 2х лет, как я перестал указывать virtual для методов, которые уже виртуальные из базового класса.

 
Alain Verleyen #:

«f» уже является виртуальным из базового класса.

Непонятно, для чего дается такая вольность для написания virtual. Чтение кода не позволяет сразу понять, если бы не было использовано override.

 
Vladislav Boyko #:

После того обсуждения я никогда не указываю virtual при переопределении метода, но я всегда обязательно указываю override. Больше 2х лет, как я ни разу не указывал virtual для метода, который уже виртуальный из базового класса.

Для меня это плохая практика при чтении кода.

 
fxsaber #:

Для меня это плохая практика при чтении кода.

Почему плохая? Разве override не достаточно, чтобы понять что метод виртуальный (и перегруженный переопределенный)? 

[edit] Если принять за правило обязательно указывать override, то я нахожу это очень удобным.