C++ 在子类中重写时是否应该重用virtual?

C++ 在子类中重写时是否应该重用virtual?,c++,c++11,C++,C++11,我知道我不需要在子类中将重写函数声明为virtual。但是如果我在子类中使用虚函数,我是否需要将子类函数声明为virtual struct Base { virtual int foo(); }; struct Derived : Base { virtual int foo() override { // ... } }; struct DoubleDerived : Derived { int foo() override {

我知道我不需要在子类中将重写函数声明为
virtual
。但是如果我在子类中使用虚函数,我是否需要将子类函数声明为
virtual

struct Base
{
    virtual int foo();
};

struct Derived : Base
{
    virtual int foo() override
    {
       // ...
    }
};

struct DoubleDerived : Derived
{
    int foo() override
    {
       // ...
    }
};

你不必这么做,不管怎么说,这个函数是虚拟的,但它毫无疑问地使它清晰明了。以前(在
override
可用之前),您可以重写某个函数,然后如果该函数在基类中发生更改,您的派生类将不再重写它,代码将在编译时不会出现任何问题。派生类中的函数不会重写任何内容,并且会变成非虚拟函数

使用编译器将防止此类错误,并且如果基发生更改,函数不能神奇地变为非虚拟函数。换句话说,如果使用或,则意味着函数为,否则将是编译错误。

我刚刚发现状态:

Virtual functions should specify exactly one of virtual, override, or final.

虚拟函数作为指针存储在类的vtable中,并从中间接调用。任何一个半途而废的编译器都应该注意到一个派生函数是虚拟的,但澄清它并没有什么坏处。@Mike是的,我的回答在任何方面与此相矛盾吗?不,只是提供了一点关于背景中发生了什么的详细信息。了解引擎盖下发生的事情往往会让事情变得更清楚。此外,一个小型编译器可以合法地生成对classname::function()的静态调用,该调用恰好与一个虚拟基类共享一个名称。