Java 访问父级';C中子类的s方法#

Java 访问父级';C中子类的s方法#,java,c#,class,inheritance,access-control,Java,C#,Class,Inheritance,Access Control,我正在尝试用C语言编写一段与Java中已有的代码等价的代码。Java代码如下所示 class Test { public static void main (String args[]) { C1 o1 = new C1(); C2 o2 = new C2(); System.out.println(o1.m1() + " " + o1.m2() + " " + o2.m1() + " " +

我正在尝试用C语言编写一段与Java中已有的代码等价的代码。Java代码如下所示

class Test
{
        public static void main (String args[])
        {
            C1 o1 = new C1();
            C2 o2 = new C2();
            System.out.println(o1.m1() + " " + o1.m2() + " " + o2.m1() + " " + o2.m2());
        }

}

class C1 
{
    void C1() {}
    int m1() { return 1; }
    int m2() { return m1(); }
}

class C2 extends C1
{
    void C2() {}
    int m1() { return 2; }
}
这就产生了输出1 2。现在,我已经为C#编写了这段代码

然而,当C2中继承的M2调用C1中的M1而不是C2中的M1时,这会打印出1 2。如何使其在C2中调用M1,只需稍作修改?

注意:在C#中,您需要使用
virtual
override
关键字来允许重写。 :

virtual关键字用于修改方法、属性、索引器或事件声明,并允许在派生类中重写它

(我的大胆)

注意:在C#中,需要使用
virtual
override
关键字来允许重写。 :

virtual关键字用于修改方法、属性、索引器或事件声明,并允许在派生类中重写它

(我的大胆)

class Program
    {
        static void Main(string[] args)
        {
            C1 o1 = new C1();
            C2 o2 = new C2();
            Console.WriteLine(o1.M1()+ " "+ o1.M2()+ " "+ o2.M1()+ " "+ ((C2)o2).M2()+ "\n");
            Console.ReadKey();
        }
    }

    public class C1
    {
        public C1()
        {
        }
        public int M1()
        {
            return 1;
        }
        public int M2()
        {
            return M1();

        }
    }

    public class C2:C1
    {
        public C2()
        {             
        }
        public int M1()
        {
            return 2;
        }
    }
 class Program
    {
        static void Main(string[] args)
        {
            C1 o1 = new C1();
            C2 o2 = new C2();
            Console.WriteLine(o1.M1() + " " + o1.M2() + " " + o2.M1() + " " + ((C2)o2).M2() + "\n");
            Console.ReadKey();
        }
    }

    public class C1
    {
        public C1()
        {
        }
        public virtual int M1()
        {
            return 1;
        }
        public  int M2()
        {
            return M1();

        }
    }

    public class C2 : C1
    {
        public C2()
        {
        }
        public override int M1()
        {
            return 2;
        }
    }