class A
    {
        public virtual void fun1(int i)
        {
            Console.WriteLine(i);
        }
        public void fun2(A a)
        {
            a.fun1(1);
            fun1(5);
        }
    }
    class B:A
    {
        public override void fun1(int i)
        {
            base.fun1(i);
        }
        static void Main(string[] args)
        {
            B b = new B();
            A a = new A();            a.fun2(b);
            a.fun2(a);
        }
     }