黑马程序员技术交流社区

标题: 虚方法 [打印本页]

作者: 罗代势    时间: 2012-12-19 20:13
标题: 虚方法
本帖最后由 罗代势 于 2012-12-21 21:55 编辑

        public void method()
        {
            Console.WriteLine("class3.method()");
        }
        public virtual void methodVirtual()          //虚方法
        {
            Console.WriteLine("class3.methodVirtual()");
        }
    }
    class class4 : class3
    {
        new public void method()
        {
            Console.WriteLine("class4.method()");
        }
        public override void methodVirtual()       //重写方法
        {
            Console.WriteLine("class4.methodVirtual()");
        }
    class Program
    {
        static void Main(string[] args)
        {
            class3 cla1 = new class3();
            class4 cla2 = new class4();
            class3 cla3 = cla2;            //设置对象cla3编译时的类型为class3,运行时的类型为class4
            Console.WriteLine("非虚方法");
            cla1.method();
            cla2.method();
            cla3.method();         //这是的结果为什么是class3.method()  ??
            Console.WriteLine("虚方法");
            cla1.methodVirtual();
            cla2.methodVirtual();
            cla3.methodVirtual();   //这里的结果为什么是class4.methodVirtual()??
         }
     }
作者: 高境    时间: 2012-12-19 20:22
这个是C#程序吧?我学过一点。
作者: 许庭洲    时间: 2012-12-19 20:30
虚方法,它的执行方式可以被派生类改变,这种改变是通过方法的重载来实现的;
using System;
class A
{
     public void F(){ Console.WriteLine("A.F");}
     public virtual void G(){ Console.WriteLine("A.G");}
}
class B:A
{
     new public void F(){ Console.WriteLIne("B.F");}
     public override void G(){ Console.WriteLine("B.G");}
}
class Test
{
      static void Main(){
              B b= new B();
              A a=b;
              a.F();
              b.F();
              a.G();
              b.G();
   }
}
例子中,A类提供了两个方法:非虚的F和虚方法G. 类B则提供了一个新的非虚的方法F,从而覆盖了继承的F;
             类B同时还重载了继承的方法G. 那么输出因该为:
                        A.F
                        B.F
                        B.G
                        B.G
提示:方法a.G()实际调用了B.G,而不是A.G. 这是因为编译时值为A,但运行时值为B,所以B完成了对方法的实际调用。

作者: Sailing.    时间: 2012-12-19 20:31
本帖最后由 Sailing. 于 2012-12-19 20:32 编辑

正如你所见,你在class4中定义的method()方法为什么要添加new关键字,其实不添加也能编译,我想在很多书籍中也有这样的实例,这叫方法的隐藏。然后引出了你的第二个疑问为什么是class4 的methodVirtual(),而不是class3的methodVirtual()的方法。这其实是一个很好的实例!如果楼主要打破沙地问到底的话,这要探究到CLR对实例方法和虚方法的的处理关系。
作者: 罗代势    时间: 2012-12-20 17:48
谢谢大家的回答




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2