C#における虚関数の役割

1590 ワード

まず例を見てみましょう.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication5
{
    class MyClass
    {
        public virtual int  fun(int i)
        {
            int k=1;
            return k * i;
        }
        public int test(int i) {
            Console.WriteLine("test   "+i*1);
            return 0;
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication5
{
    class VirtualFunctionClass:MyClass
    {
        public override int fun(int i)
        {
            int k = 3;
            return k * i;
        }
        public new int test(int i) 
        {
            Console.WriteLine("test   " + i*2);
            return 0;
        }

    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication5
{
    class TestClass3
    {
        static void Main()
        {
            MyClass myc1 = new MyClass();
            MyClass myc2 = new VirtualFunctionClass();
            Console.WriteLine(myc1.fun(1));
            Console.WriteLine(myc2.fun(1));
            myc1.test(1);
            myc2.test(1);
            Console.ReadLine();

        }
    }
}
/*     :
* 1
* 3
* test   1
* test   1
*/

 
C#とJAVAでは、派生クラスでベースクラスのメソッドaを書き換え、ベースクラスの参照(派生クラスのオブジェクト、すなわち多態性を指す)でメソッドaを呼び出し、結果が異なることがわかる.
JAVAではすべての方法が虚の方法であると考えられる.C#ではベースクラスのメソッドにvirtualキーワードを付けて派生クラスに書き換えるだけで、マルチステート時に有効です.