Чистый виртуальный метод С++ не требует переопределения ключевого слова

Я написал базовый класс с виртуальным чистым методом и двумя производными классами, которые открыто наследуют этот базовый класс. Я использовал «переопределение» для реализации версий чистого виртуального абстрактного базового класса. В Xcode и многих других IDE обычно есть ключевая команда, которую нужно удерживать при нажатии на объявление метода, которое направит вас прямо к его определению. Я чувствую, что мое виртуальное чистое объявление «связано» с моими переопределенными методами производных классов, потому что я могу переходить от базового класса к производным классам, используя Command + щелчок по виртуальному чистому объявлению, однако я возможность свободно удалить ключевое слово «переопределить» и скомпилировать без ошибок, хотя я всегда считал, что «переопределение» необходимо при реализации определения для чисто виртуального метода. Любая помощь, объясняющая это, была бы отличной:

Вот абстрактный базовый класс:

class MillisecondsHertzValueBase
{
private:

// Removed code to reduce length

public:
    MillisecondsHertzValueBase();
    virtual ~MillisecondsHertzValueBase();

    virtual void calculateValues (const double &input) = 0;

    // Removed code to reduce length
};

Вот один из заголовочных файлов производных классов, где я могу свободно удалить ключевое слово «override»:

class MillisecondValues : public MillisecondsHertzValueBase
{
public:
    ~MillisecondValues();
    void calculateValues (const double &input) override;
};

Вот реализация:

MillisecondValues::~MillisecondValues() {}

void MillisecondValues::calculateValues (const double &input)
{
    // Removed code to reduce length
}

person joe_04_04    schedule 09.01.2018    source источник
comment
override был добавлен в C++11. Сделать это необходимым было бы довольно большим переломным изменением.   -  person chris    schedule 10.01.2018
comment
Вы смешали 2 концепции, есть термин override, который означает определение функции с той же сигнатурой в производном классе, и есть ключевое слово (которое было добавлено в С++ 11). Вы должны переопределить абстрактную функцию, но не должны использовать ключевое слово, чтобы сделать переопределение явным (но должны). Это похоже на то, что вам не нужно использовать virtual для переопределения, но следует.   -  person Slava    schedule 10.01.2018
comment
Вы можете пожаловаться GCC, если пропустите ключевое слово override. Clang поддерживает предупреждение только в том случае, если вы используете ключевое слово в некоторых местах, но не в других.   -  person Daniel H    schedule 10.01.2018