在覆盖子子类时,我应该重用虚拟吗?

时间:2017-05-22 01:50:06

标签: c++ c++11

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

struct Base
{
    virtual int foo();
};

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

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

2 个答案:

答案 0 :(得分:4)

你不必,这个功能无论如何都是虚拟的,但它无疑是明确的。以前(在override可用之前)你可以覆盖一些函数,然后如果函数在基类中被更改,你的派生类将不再覆盖它,代码将编译而没有任何问题。你在派生类中的函数不会覆盖任何东西,而且会变成非虚拟的。

使用override编译器可以防止出现这种错误,如果更改了base,则该函数不能神奇地变为非虚拟。换句话说,如果使用overridefinal,则表示函数为virtual,否则会出现编译错误。

答案 1 :(得分:0)

我刚发现Core guideline C.128声明:

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