仮想関数の明示的なオーバーライド

c++ c++-cli override virtual-functions
仮想関数の明示的なオーバーライド

C / CLIには、標準C には存在しないキーワード(「不明」)があることを発見しました:「オーバーライド」。

私はC / CLIについてあまり知らないので、誰かがそこに含まれる目的を説明できますか?それがC に追加されるのが望ましい機能である場合

  6  3


ベストアンサー

http://msdn.microsoft.com/en-us/library/41w3sh1c.aspx [override]は、C / CLIおよびVisual C 実装で使用できるMicrosoftの特別なキーワード拡張機能です。 これは、Javaまたはhttp:// msdnのhttps://stackoverflow.com/questions/94361/when-do-you-use-javas-override-annotation-and-why [@ Override]アノテーションに似ています。 C#のmicrosoft.com/en-us/library/ebca9ah3(v = VS.100).aspx [override]を使用して、意図したものをオーバーライドしなかった場合に備えて、コンパイル時のチェックを改善します。

最初のリンクから:

__
overrideは、マネージ型のメンバーがベースクラスまたはベースインターフェイスメンバーをオーバーライドする必要があることを示します。 オーバーライドするメンバーがない場合、コンパイラーはエラーを生成します。

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

オーバーライドは状況依存キーワードです。 詳細については、状況依存キーワードを参照してください。
__

C 11標準の時点で、 `override`指定子は標準化されたキーワードになりました。 サポートはまだ制限されており、このhttp://wiki.apache.org/stdcxx/C0xCompilerSupport[Apache StdCxxのページ]に従って、 `override`はGCC 4.7 、Intel C 12.0+、およびVisual C でサポートされています2012(Visual C + 2005の事前標準化サポート付き)。

12


これは、コンパイラーが2つの方法でミスをキャッチするのに役立ちます。

  1. クラスで `override`で関数を宣言するが、ベース
    クラスにはその機能がないため、コンパイラは、自分が思っていたものをオーバーライドしていないことを通知できます。 「オーバーライド」が使用可能でない場合、コンパイラはエラーを認識できません。単に、新しい関数を導入するつもりであると仮定するだけです。

  2. 下位クラスに関数がある場合( `override`なし)、
    そして、基本クラスでvirtualと同じ関数を宣言すると、コンパイラは、基本クラスの変更が子孫の元の宣言の意味に影響したことを通知できます。 子孫は「オーバーライド」を使用する必要があるか、いずれかの関数のシグネチャを変更する必要があります。

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

1


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

プロパティまたはメソッドをオーバーライドする場合、 `override`キーワードを右側に書くことでこれを示さなければなりません。
__

次に、http://www.functionx.com/cppcli/classes2/Lesson21.htm [リンク]に従っていくつかの例を参照してください。

0


C / CLIのオーバーライドキーワードは、C 自体の一部ではなく、.Netから取得されます。 オーバーライドはすでに説明されているため、代替手段を知る必要があります。 「オーバーライド」しない場合は、「新規」にすることができます。 「新規」にすると、子の親クラスのメンバーをオーバーライドするのではなく、同じ名前の新しいメンバーを作成します。 新しいキーワードとオーバーライドキーワードは、基本クラスポインターを使用して、派生クラスオブジェクトを指す場合にのみ異なります。

したがって、基本クラスポインターを使用して、派生クラスオブジェクトを指す場合:

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.

0


タイトルとURLをコピーしました