显式覆盖和最终的c ++ 0x

cod*_*ddy 5 c++ c++11

根据维基百科,在这个例子中:

struct Base {
    virtual void some_func(float);
};

struct Derived : Base {
    virtual void some_func(float) override;
};
Run Code Online (Sandbox Code Playgroud)

我认为override不是C++关键字,那它究竟意味着什么?没有那个关键字,我们可以实现同样的目标,那么为什么有人需要呢?

还有一个关键字final在VS2010上还没有用:

struct Base1 final { };

struct Derived1 : Base1 { }; // ill-formed because the class Base1 
                             // has been marked final
Run Code Online (Sandbox Code Playgroud)

NPE*_*NPE 16

在C++ 11,override并且final是"标识符有特殊的含义." 它们不是关键字,只有在特定上下文中使用时才会获得特殊含义(在声明虚函数时).

这个想法是允许编译器通过允许程序员明确地声明他们的意图来捕获某些类型的错误(例如,覆盖现有的虚函数而不是创建新的函数).

以下是该标准的相关引用,并附有示例:

C++ 11 10.3 4如果某个类B中的虚函数f用virt-specifier标记,final而在从B派生的类D中,函数D :: f会覆盖B :: f,则该程序格式错误.[例如:

struct B {
virtual void f() const final;
};
struct D : B {
void f() const; // error: D::f attempts to override final B::f
};
Run Code Online (Sandbox Code Playgroud)

- 末端的例子]

5如果使用virt-specifier标记虚函数override 并且不覆盖基类的成员函数,则程序格式错误.[例如:

struct B {
virtual void f(int);
};
struct D : B {
void f(long) override; // error: wrong signature overriding B::f
void f(int) override; // OK
};
Run Code Online (Sandbox Code Playgroud)

- 末端的例子]