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

时间:2012-01-04 16:38:01

标签: c++ c++11

根据Wikipedia,在此示例中:

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

struct Derived : Base {
    virtual void some_func(float) override;
};

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

还有一个关键字final尚未在VS2010上运行:

struct Base1 final { };

struct Derived1 : Base1 { }; // ill-formed because the class Base1 
                             // has been marked final

1 个答案:

答案 0 :(得分:16)

在C ++ 11中,overridefinal是“具有特殊含义的标识符”。它们不是关键字,只有在特定上下文中使用时才会获得特殊含义(在声明虚函数时)。

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

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

  

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
};
     

-end example]

     

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
};
     

-end example]