A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗代势 中级黑马   /  2012-12-19 20:13  /  1583 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 罗代势 于 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()??
         }
     }

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

4 个回复

倒序浏览
这个是C#程序吧?我学过一点。
回复 使用道具 举报
虚方法,它的执行方式可以被派生类改变,这种改变是通过方法的重载来实现的;
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:32 编辑

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

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
谢谢大家的回答
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马