C++/CLIに標準C++で存在しないキーワード(AFAIK)があることがわかりました:override
。仮想関数の明示的な上書き
私はC++/CLIについてよく知らないので、誰かがそこに含まれている目的を説明することができますか?また、C++に追加するのが望ましい機能ですか?
C++/CLIに標準C++で存在しないキーワード(AFAIK)があることがわかりました:override
。仮想関数の明示的な上書き
私はC++/CLIについてよく知らないので、誰かがそこに含まれている目的を説明することができますか?また、C++に追加するのが望ましい機能ですか?
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から
:
あなたは
virtual
キーワードで に親クラスのプロパティやメソッドにフラグを付けた場合 からそれをクラスを派生するとき、あなたはメソッドまたは プロパティを無視してすることはできませんがそれを実装する。ただし、 プロパティまたは プロパティを実装する場合は、 が プロパティまたはメソッドの新しいバージョンを提供していることを示す必要があります。新しい バージョンのプロパティまたはメソッドを提供することは、それをオーバーライドすると言われる です。プロパティまたは メソッドをオーバーライドするとき、あなたはその 右に
override
キーワードを書い ことによって、これを示さなければなりません。
次に、linkの例を参照してください。
これは、overrideキーワードの仕組みを説明しています。なぜそれが導入されたのか説明していない。 –
Robの#2と同様、これは当てはまりません。基底クラスで仮想宣言された関数のシグネチャを一致させるだけで関数をオーバーライドすることができ、 'override'キーワードは省略でき、関数は引き続きオーバーライドされます。膨大な量の既存のコードを壊さずに、新しいキーワードを必須にすることはできません。 –
それは、コンパイラは、2つの方法あなたの過ちをキャッチできます:
あなたのクラスでoverride
で関数を宣言が、ベースクラスがその機能を持っていない場合、コンパイラがあることを伝えることができた場合あなたはあなたが思っていたものを上書きしていません。 override
が利用できない場合、コンパイラはエラーを認識できません。新しい関数を導入しようとしていると仮定します。
子孫クラス(override
を除く)に関数があり、その関数を基本クラスの仮想関数と宣言すると、コンパイラは基本クラスの変更が子孫の元の宣言。子孫はoverride
を使用する必要があります。そうしないと、いずれかの関数の署名を変更する必要があります。
この機能は既にC++ 0xに追加されています。
私は#2が当てはまるとは思わない。実際に 'override'キーワードを使わなくても関数を上書きすることができます。これがこれまでに変更された場合、多くの既存コードが壊れてしまいます。 –
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.
はあなたが考えているキーワードがのあるものを言いませんでした。それは "明白"ですか?もしそうなら、それは標準のC++にあります。 –
@Wes Hardaker実際に私は言った。それは "オーバーライド"キーワードです。 – kunigami