从书上看看不明白会哪里不同,到底使用条件不同还是使用效果不同呢?

解决方案 »

  1.   

    你从基类调用虚函数,就会不同。用override重写,会调用重写后的函数。用new重写,则仍调用基类的函数。
      

  2.   

    using System;
    public class A
    {
    public virtual void F()
    {
    Console.WriteLine("A.F()");
    }
    }class B:A
    {
    public override void F()
    {
    Console.WriteLine("B.F()");
    }
    }class C:A
    {
    public new void F()
    {
    Console.WriteLine("C.F()");
    }
    }class Test
    {
    public static void Main()
    {
    B b = new B();
    b.F(); C c = new C();
    c.F(); A a;
    a = b;
    a.F();
    a = c;
    a.F();
    }
    }
      

  3.   

    //请参看输出结果A a;
    a = b;//基类的引用指向派生类的对象,调用派生类的方法
    a.F();
    a = c;//基类的引用指向派生类的对象,调用基类的方法
    a.F();
      

  4.   

    你从基类调用虚函数,就会不同。用override重写,会调用重写后的函数。用new重写,则仍调用基类的函数。
      

  5.   

    上面从语法上讲了,我从底层实现讲讲吧,呵呵基础知道:
        每个类有一个方法表,每个方法称之为方法槽虚方法重载后
        重载的方法重写这个方法槽new 
        新增方法槽,原有的方法槽保留故有以上的行为
      

  6.   

    new 覆盖了子类的方法。
    -------------
    应该的隐藏
      

  7.   

    怎样调用父类的方法?((baseCalss)newClass).Functions(); 好像可以,只有这种方法吗?
    是不是override以后子类就没办法使用父类的方法了?
      

  8.   

    怎样调用父类的方法?((baseCalss)newClass).Functions(); 好像可以,只有这种方法吗?
    是不是override以后子类就没办法使用父类的方法了?
      

  9.   

    用 base.Function() 可以调用父类的方法。但前两天我有个奇怪的需求,想绕过父类的方法直接调用祖父类的方法,发现C#居然无法实现
      

  10.   

    base.Function()只能在本类中使用,不能在实例化以后的变量上使用吧。
      

  11.   

    隐藏:
         子类重定义父类的方法(函数声明一致),实现重定义只需要加上关键字new;
         如果没有添加关键字new,那么编译器将默认添加new;
         隐藏的成员是早绑定。
         例:
         class B : A {}     //将new一个B的实例,然后把引用传给a,
         //a只能使用B实例中继承来得方法和字段,即只能使用A中的成员
         A a = New B();
         a.Fun();//调用A中的Fun覆盖:
         实际是就是虚函数,采用晚绑定的方式。
         例:
         class A { public virtual void Fun(){} }
         class B : A { public new virtual void Fun(){} }//这是隐藏
         class C : B { public override void Fun(){} }//这是覆盖
         A[] arryA = new A[2];//早绑定,绑定到A
         arryA[0] = new B();
         arryA[1] = new C();
         arryA[0].Fun();//将调用A的Fun()
         arryA[1].Fun();//将调用A的Fun()     B[] arryB = new B[2];//晚绑定
         arryB[0] = new B();//绑定到B
         arryB[1] = new C();//绑定到C
         arryB[0].Fun();//将调用B的Fun()
         arryB[1].Fun();//将调用C的Fun()