代码如下:
public class a//重载
        { 
            public void a1()
            {
                Console.WriteLine("这是基类的输出:");
            }
        }
        public class b : a
        {
            public new void a1()
            {
                string name;
                string id;
                Console.Write("输入你的名字:");
                name = Console.ReadLine();
                Console.Write("输入你的学号:");
                id = Console.ReadLine();
                Console.WriteLine("你好{0}",name);
                Console.WriteLine("你的学号是{0}", id);
            }

public class cx//重写        { 
           public virtual void a1()
           {
               Console.WriteLine("这是基类的输出:");
           }
        }
        public class cx1 : cx
        {
            public override void a1()
            {
                string name;
                string id;
                Console.Write("输入你的名字:");
                name = Console.ReadLine();
                Console.Write("输入你的学号:");
                id = Console.ReadLine();
                Console.WriteLine("你好{0}",name);
                Console.WriteLine("你的学号是{0}", id);
            }
        }

结果是一样的:那区别在那里。它们好处都在那里。

解决方案 »

  1.   

    楼上的两位,很谢谢你们,但我在运行时得到的结果并不是你们所说的那样。
    例如重写会覆盖基类的方法,但我用new初始化(cx a1234=new cx;  a1234.a1();)得到的结果并不是所说的覆盖。
      

  2.   

    这里不存在重载只是new 和override!
    new只是隐藏父类的基方法,override覆盖父类的基方法
    区别在于
    父类 instance=new 子类();
    instance.基方法();试下就知道了。。
      

  3.   

    http://wenku.baidu.com/view/64ef88d97f1922791688e8f0.html
    http://wenku.baidu.com/view/133527fe910ef12d2af9e7bd.html
      

  4.   

    你实例化要子类进行实例化,如果还类父类自已本身去例化,当然不会出现什么效果!!cx a1234=new cx1();//用子类去实例化父类声明的对象
    a1234.a1();//调用的是子类的方法
      

  5.   

       你写的第一个 也不是重载 但第二个的确的重写。第一个New关键字 是吧 父类的同名方法隐藏 。但不是覆盖。方法体 还是在内存中的。你实例化的时候 赋给谁调用的就是那个方法。 这里你写的是父类所以 。下面的重写 就是彻底覆盖了 如果用子类来创建实例化 则父类的 方法也变成了 子类的同名方法。
      

  6.   

    重载是类似这样的两个方法bool method(int x){...}bool method(int x, string y){...}
    它们的方法签名不同,但是方法名称相同,这家做重载。比如c#中许多基本符号可以重载,比如你可以重载+号用于Person对象之间,结果就像var child=Person1+Person2;你在Person类上定义一个重载+号的方法,它接受两个Person类型的参数,判断这两个Person是否符合配对标准,然后new出来一个新的Person。
    重写则是针对继承的,表示子类可以修改父类的方法实现。如果你没有写过那些需要将来对某个class或者interace的子类对象都可执行的方法,就还是没有理解继承概念了。
      

  7.   

    bool method(int x){...}bool method(string x){...}
    这也是重载,因为它们的方法参数签名不同,而方法名相同。
      

  8.   

    这跟重载有个P关系...前天有人问了个差不多的问题,你俩是不是同学啊?http://topic.csdn.net/u/20101222/21/e2826e78-c280-4650-b273-cb4b677442a3.html
      

  9.   

    什么叫结果是一样的。好处是什么。比如说:
    int Add(int a, int b)
    {
        return a + b;
    }int mul(int a, int b)
    {
        return a * b;
    }
    int power(int a, int b)
    {
        int r = 1;
        for (i = 1; i <= b; i++) r *= a;
        return r;
    }调用:
    Console.WriteLine(add(2, 2));
    Console.WriteLine(mul(2, 2));
    Console.WriteLine(power(2, 2));结果是一样的。那么你告诉我三个函数哪个的优点是什么?
      

  10.   

    方法名相同,但是方法参数签名不同,这才叫重载。你说的“我也看作重载”过分牵强,这很可能是在学校里养成的习惯性的诡辩方法。
    其实重载跟面向对象不搭界,于是也就谈不上你说的什么“隐藏父类,执行子类”。而继承的目的是让原本冲着父类、接口而设计的程序可以正常运行,比如我们写下了一段关于“生鲜商品”对象的销售盘点程序(例如需要登记它的重量、总金额、合理的损耗、保鲜日期等等信息),那么这段程序写下之后可能过了2年,新的生鲜商品增加了几十种,我们拿出最新定义任何一个子类的对象,还去运行原来这段处理程序,仍然可以通过软件测试。而你的所谓“隐藏父类、执行子类”其实是空洞无物的。如果我们用“铅笔盒”作为生鲜商品,程序就会抛出异常而中断。因此面向对象强调的不是编程语言的形式,而是首先用应用领域的术语来定义,避免用OOPL语言去实现机械化、诡异的代码(有些人为了少写一点代码,于是让Studen类继承自School类,这就给将来程序扩展和应用的稳定性、可理解性带来的问题)。而至于你说让子类new一个同样名称同样参数签名的方法(注意是同样参数签名,所以根本不是什么重载),跟上述生鲜商品处理流程的可继承性没有半点关系!它纯粹是闲的没事时,偏要让另外一个无关的方法跟父类的方法重名,所以这几乎应该是被禁止的做法。只不过早期的.net的clr从c++中继承了这个语法,或者说不得不支持多种早期编程语言的写法而已。