2011-01-28 3 views
6

C++/CLIに標準C++で存在しないキーワード(AFAIK)があることがわかりました:override仮想関数の明示的な上書き

私はC++/CLIについてよく知らないので、誰かがそこに含まれている目的を説明することができますか?また、C++に追加するのが望ましい機能ですか?

+0

はあなたが考えているキーワードがのあるものを言いませんでした。それは "明白"ですか?もしそうなら、それは標準のC++にあります。 –

+3

@Wes Hardaker実際に私は言った。それは "オーバーライド"キーワードです。 – kunigami

答えて

12

overrideは、C++/CLIおよびVisual C++の実装で使用できるMicrosoftの特別なキーワード拡張です。これは、Javaの@Override注釈やC#のoverrideに似ていて、あなたが意図したものを上書きしなかった場合に備えて、より良いコンパイル時間のチェックを提供します。最初のリンクから

オーバーライドは、マネージ型のメンバは、ベースクラスまたはベースインターフェイスメンバをオーバーライドしなければならないことを示しています。上書きするメンバがない場合、コンパイラはエラーを生成します。

オーバーライドはネイティブターゲット(/ clrなし)用にコンパイルするときにも有効です。詳細は、「指定子のオーバーライドとネイティブコンパイル」を参照してください。

オーバーライドは状況依存のキーワードです。詳細については、コンテキスト・センシティブ・キーワードを参照してください。

C++ 11標準では、override指定子が標準化されたキーワードになりました。サポートは依然として限定されており、page from Apache StdCxxとして、overrideはGCC 4.7+、Intel C++ 12.0+、およびVisual C++ 2012(Visual C++ 2005の標準化前のサポート)でサポートされています。 hereから

0

あなたはvirtual キーワードで に親クラスのプロパティやメソッドにフラグを付けた場合 からそれをクラスを派生するとき、あなたはメソッドまたは プロパティを無視してすることはできませんがそれを実装する。ただし、 プロパティまたは プロパティを実装する場合は、 が プロパティまたはメソッドの新しいバージョンを提供していることを示す必要があります。新しい バージョンのプロパティまたはメソッドを提供することは、それをオーバーライドすると言われる です。

プロパティまたは メソッドをオーバーライドするとき、あなたはその 右にoverrideキーワードを書い ことによって、これを示さなければなりません。

次に、linkの例を参照してください。

+0

これは、overrideキーワードの仕組みを説明しています。なぜそれが導入されたのか説明していない。 –

+0

Robの#2と同様、これは当てはまりません。基底クラスで仮想宣言された関数のシグネチャを一致させるだけで関数をオーバーライドすることができ、 'override'キーワードは省略でき、関数は引き続きオーバーライドされます。膨大な量の既存のコードを壊さずに、新しいキーワードを必須にすることはできません。 –

1

それは、コンパイラは、2つの方法あなたの過ちをキャッチできます:

  1. あなたのクラスでoverrideで関数を宣言が、ベースクラスがその機能を持っていない場合、コンパイラがあることを伝えることができた場合あなたはあなたが思っていたものを上書きしていません。 overrideが利用できない場合、コンパイラはエラーを認識できません。新しい関数を導入しようとしていると仮定します。

  2. 子孫クラス(overrideを除く)に関数があり、その関数を基本クラスの仮想関数と宣言すると、コンパイラは基本クラスの変更が子孫の元の宣言。子孫はoverrideを使用する必要があります。そうしないと、いずれかの関数の署名を変更する必要があります。

この機能は既にC++ 0xに追加されています。

+1

私は#2が当てはまるとは思わない。実際に 'override'キーワードを使わなくても関数を上書きすることができます。これがこれまでに変更された場合、多くの既存コードが壊れてしまいます。 –

0

C++/CLIのoverrideキーワードは.NETに由来し、C++自体の一部ではありません。上書きはすでに説明されているので、その代替方法を知る必要があります。あなたがそれを "上書き"しない場合、それを "新しい"にしたいかもしれません。それを「新規」にすることで、子クラスの親クラスのメンバーをオーバーライドするのではなく、同じ名前の新しいメンバーを作成します。新規およびオーバーライドキーワードは、基本クラスポインタを使用して派生クラスオブジェクトを指す場合にのみ異なります。あなたが派生クラスのオブジェクトへの基底クラスのポインタとポイントを使用している場合

ので、:

If you call an "override"n member: 
     the derived class member is called 
if you call the "new"ed member: 
     the base class member is called.