仮想関数仮想簡単
いずれかの仮想基本クラスとメンバ関数が派生クラスの一つ以上の仮想関数を再定義するために呼び出される宣言しました。
効果は、仮想関数多型(多型)、多型インタフェースと実装の分離を達成することです。
C#は完全にオブジェクト指向言語として、すべての機能がデフォルトで仮想的ではありませんが、基本クラスで仮想キーワードを宣言することができ、あなたは、派生クラスでその機能をオーバーライドするキーワードによってこれを上書きすることができます。書き換え後の仮想関数は、まだ仮想関数です。仮想メンバ関数のみ意味でクラスのインスタンス、そう部材フィールドおよび静的関数は、仮想として宣言することはできないので、オーバーライド及び要約と一緒に使用することができません。
一般的な機能を持つ仮想関数差
静的実行可能ファイルにコンパイルされ、コンパイル時に一般的な機能は、相対アドレスが死んで書かれたプログラムの実行、中に変更されていません!コンパイル時に仮想関数が静的にコンパイルされていない、その相対アドレスは、動的にクラス宣言は、クラス宣言、実施例と呼ばれる定義された時間を実行しているオブジェクトのインスタンスに応じて呼び出される関数を決定する、不確実ですクラスのクラスのインスタンスと呼ばれます。
仮想仮想関数
関数は、オブジェクトクラス定義ステートメント、すなわち、クラス宣言、仮想関数かどうかを確認するために呼び出された関数を確認するために、直接システム、オブジェクトと呼ばれる1、。
ない仮想関数場合2、それが直接の機能を実行します。そして、それはすぐに機能を実行しませんが、クラスの検査オブジェクトインスタンスに回すために、この時間ので、仮想関数である仮想キーワードは、存在する場合。
図3は、クラスのこのインスタンスでは、彼は、仮想関数を再実装がある場合、直ちに(overrideキーワードを介して)このクラス再実装関数のインスタンスを実行するクラスのインスタンスを定義するかどうかを確認します。そうでない場合、システムは、クラスの親クラスのインスタンスを見つけるまで保持されます、そして最初の親クラスまで、仮想関数をオーバーライドして、実行するまで親クラスは、クラスのインスタンスで検査を繰り返します過負荷後の機能で親クラス。
例:
結果:
一般的な面接の質問:
1 クラスプログラム 2 { 3 クラス4 { 5 パブリックA() 6 { 7 PrintFields()。 8 } 9 パブリック仮想ボイドPrintFields(){} 10 } 11 12 クラスB: 13 { 14 INT X = 1 。 15 のint Y; 16 17 公共のB() 18 { 19 Y = - 1 。 20 } 21 22 公共 オーバーライド ボイドPrintFields() 23 { 24 Console.WriteLineを(" X = {0}、Y = {1} " 、x、y)は、 25 } 26 } 27 28 静的 ボイドメイン(文字列[]引数) 29 { 30 新B(); 31 } 32 }
Q:どのような出力を生成するために、)(新しいBを使用してBのインスタンスを作成しますか?
X = 1、Y = 0
分析:NO第一基準暗黙コール親クラスのコンストラクタAはPrintFields()メソッドを実行しない、Bのインスタンスを作成し、クラスBのターンのインスタンスを確認するために、チェックする仮想メソッドであるメソッドがオーバーロードしている、本方法は、過負荷出力を行いますX = 1、Y = 0
注意:最初は、それ自体が、サブクラスのコンストラクタを呼び出す前に、オブジェクトのサブクラスを作成し、親クラスのコンストラクタを呼び出して、あなたは親クラスのコンストラクタを呼び出したいどちら指定しなかった場合、システムは、暗黙のうちに親クラスを呼び出しません引数のコンストラクタ
終わり!