2012-01-04 63 views
5

Wikipedia,在这个例子:显式覆盖和最后的C++ 0x

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

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

我以为override不是C++的关键字,那么什么是真正的意思? 我们可以在没有关键词的情况下实现同样的目的,为什么有人需要它?

还有哪些还没有在VS2010的工作关键字final: “具有特殊意义的标识符”

struct Base1 final { }; 

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

你没读了维基百科的文章链接到?它解释了为什么该关键字是有用的。 – Mat 2012-01-04 16:41:17

+2

'sealed'是VC++ 2010关于'final'的关键字。 – ildjarn 2012-01-04 17:26:38

+0

@ildjarn:在Microsoft C++/CLI模式或标准C++ 11模式下? – dalle 2012-01-04 18:27:47

回答

16

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

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

这里是从标准的相关报价,与实施例:

C++ 11 10.3 4如果在一些B类的虚拟函数f标有 的virt说明符final和在从B函数D :: f 派生的D类重写B :: f,该程序是格式不正确的。 [实施例:

struct B { 
virtual void f() const final; 
}; 
struct D : B { 
void f() const; // error: D::f attempts to override final B::f 
}; 

末端示例]

5如果一个虚拟函数标有VIRT说明符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 
}; 

末端示例]

+0

谢谢,但第二个函数只有当签名是无效的f()覆盖。 (我已经在我的编辑器中测试过),但现在我明白了:) – codekiddy 2012-01-04 17:02:42

+0

我猜这是一个错字。编辑。 – 2012-01-04 18:09:03

+0

@德鲁:你的编辑是正确的。 : - ] – ildjarn 2012-01-04 19:38:39