派生クラスの仮想関数には、virtualを付ける必要はない

基本クラスで仮想関数を定義したら、派生クラスではその関数に、virtualを付ける必要はありません。付けなくても、自動的に仮想関数になります。

#include <iostream>

struct Base {
    virtual void f()
    {
        std::cout << "Base" << std::endl;
    }
};

struct Derived : Base {
    void f() override
    {
        std::cout << "Derived" << std::endl;
    }
};

int main()
{
    Derived d;
    Base& b = d;

    b.f();
}

出力:

Derived

C++03においては、派生クラスでも「この関数はオーバーライドを意図してるんだ」というのを示すためにvirtualを付けることに意義がありました。

C++11ではoverrideキーワードを使えばその意図は示せるので、派生クラスの仮想関数にvirtualを付ける必要はありません。