虚の方法virtualの詳しい解



C#のプログラムコンパイルの観点から、他の一般的な関数とどのような違いがありますか?一般関数はコンパイル時に実行ファイルに静的にコンパイルされ、その相対アドレスはプログラム実行中に変化しない、つまり書かれている!虚関数はコンパイル中に静的にコンパイルされず、その相対アドレスは不確定であり、実行時期オブジェクトインスタンスに基づいて呼び出す関数を動的に判断し、その申明時に定義されたクラスを申明クラス、その実行時にインスタンス化されたクラスをインスタンスクラスと呼ぶ.
例えば、飛鳥bird=newスズメ();では飛鳥は申明類、スズメは実例類です.
具体的な検査の流れは以下の通りです.
1、オブジェクトの関数を呼び出すと、システムは直接このオブジェクトが定義したクラス、すなわち、呼び出された関数が虚関数であるかどうかを確認する.
2、虚関数でない場合は、その関数を直接実行します.virtualキーワード、すなわち虚関数がある場合は、このときすぐに関数を実行するのではなく、オブジェクトのインスタンスクラスをチェックします.
3、このインスタンスクラスでは、彼はこのインスタンスクラスの定義に虚関数が再実装されているかどうかをチェックします.(overrideキーワードで)がある場合はOKですが、インスタンスクラスのこの再実装された関数はすぐに実行されます.そうでない場合は、インスタンスクラスの親を探し続け、最初に虚関数を再ロードした親が見つかるまで、親を繰り返します.クラスに再ロードされた関数.
この点を知れば、次のコードの実行結果が理解できます.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace    
{
    class A
    {
        public virtual void Func() //   virtual,          
        {
            Console.WriteLine("Func In A");
        }
    }

    class B : A //   B  A   ,  A   ,B   
    {
        public override void Func() //   override ,          
        {
            Console.WriteLine("Func In B");
        }
    }

    class C : B //   C  A   ,  B   ,C   
    {
    }

    class D : A //   B  A   ,  A   ,D   
    {
        public new void Func() //   new ,           ,       
        {
            Console.WriteLine("Func In D");
        }
    }

    class program
    {
        static void Main()
        {
            A a;         //     a  A    .  A  a    
            A b;         //     b  A    .  A  b    
            A c;         //     c  A    .  A  b    
            A d;         //     d  A    .  A  b    

            a = new A(); //    a  ,A a    
            b = new B(); //    b  ,B b    
            c = new C(); //    b  ,C b    
            d = new D(); //    b  ,D b    

            a.Func();    //   a.Func:1.      A 2.         3.       A,     4.     A     5.     Func In A
            b.Func();    //   b.Func:1.      A 2.         3.       B,     4.     B     5.     Func In B
            c.Func();    //   c.Func:1.      A 2.         3.       C,     4.     C   B,     5.    B  Func   5.     Func In B
            d.Func();    //   d.Func:1.      A 2.         3.       D,    (        ,  D    Func(),     override   ,          ) 4.     D   A,     5.    A  Func   5.     Func In A
            D d1 = new D();
            d1.Func(); //   D   Func(),     Func In D
            Console.ReadLine();
        }
    }
}