2012-01-04 21 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

あなたはWikipediaの記事あなたにリンクしていることを読んでいませんか?そのキーワードがなぜ有用かを説明します。 – Mat

+2

'sealed'は' final'のVC++ 2010のキーワードです。 – ildjarn

+0

@ildjarn:Microsoft C++/CLIモードまたは標準C++ 11モードですか? – dalle

答えて

16
C++で

11、overridefinalは "特別な意味を持つ識別子" です。それらはキーワードではなく、特定のコンテキスト(仮想関数の宣言時)で使用される場合にのみ特別な意味を獲得します。

プログラマが明示的に状態を記述できるようにする(たとえば、新しいものを作成するのではなく、既存の仮想関数を上書きする)ことによって、コンパイラが特定の種類のエラーを捕捉できるようにすることです。いくつかのクラスBの仮想関数fがfinal 仮想環境指定子ととにマークされている場合

C++ 11 10.3 4:ここ

は、実施例に標準から関連の引用であります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 
}; 

末端例]仮想関数は、仮想環境指定子override でマークされ、ベースクラスのメンバ関数をオーバーライドしない場合

5、プログラム はill-あります形成された。 [例:

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

ありがとうございますが、2番目の関数は、署名がvoid f()overrideの場合にのみ機能します。 (私は私のエディタでそれをテストしました)しかし、私は今理解しています:) – codekiddy

+0

私はそれが誤植だと思います。編集されました。 –

+0

@Drew:あなたの編集は正しいです。 : - ] – ildjarn

関連する問題