Должен ли я указывать "виртуальный" снова, когда я переопределяю функцию С++?

Когда я переопределяю виртуальную функцию:

class Geoff
{
 public:
  virtual int getArea() { return 0; }
}

Должен ли я указывать "виртуальный" снова, когда я его переопределяю? Разве это имеет значение? Я знаю, что оба способа, похоже, работают нормально, просто интересно, есть ли что-то еще, чем это.

class George : public Geoff
{
 public:
  virtual int getArea() { return x*y; }
}

Ответы

Ответ 1

Если вы используете С++ 11, вы должны вместо этого использовать override, который оба документа, которые вы переопределяете виртуальную функцию и проверяет, существует ли соответствующая виртуальная функция в базе для переопределения.

int getArea() override { return x*y; }

В С++ 03 это стилистический выбор - поместите virtual, если вы чувствуете, что он добавляет значение документации.

Ответ 2

Нет, используйте переопределение. (http://en.cppreference.com/w/cpp/language/override)

У этого есть преимущество, если он не является виртуальным в родительском объекте.

изменить

Как отметил Марк, он также терпит неудачу, если подпись не соответствует, тогда как виртуальный будет "успешно". Котировки пугалов состоят в том, что несогласованная подпись скроет скрытый метод в базе и создаст новый виртуальный метод, который не связан.