a继承了b    a是子类,b是父类  a b类中都有一个函数名相同的方法,
最后实例化a
   则方法是执行a的还是b的?我这边测试的都是 执行子类的方法    

解决方案 »

  1.   

    也就是执行子类的函数是正确的对吧?
       那我的问题来了:  那多态的时候,就是用子类去重新父类方法,这样还需要加virtual 和 override 么?
       加virtual 和 override 不是不执行父类的方法,而用子类去替换么?
      

  2.   

    本帖最后由 caozhy 于 2011-10-12 01:45:15 编辑
      

  3.   

    这样写 vs不提示你改良?一般VS会让你用new 或者 override 重构那个函数
      

  4.   

    本帖最后由 caozhy 于 2011-10-12 02:02:43 编辑
      

  5.   

    A b = new B();
    关键看来定义的类型,这里是A类型,当然实例化A了
      

  6.   

    大家说的我有点迷糊,我说说自己的看法吧:
        子类A   父类B
      
      A a = new B()  正确
      A a = new A() 正确
      B b = new B() 正确
      B b = new A() 不正确,即使加强制转换,也会出错。
    但是C#,我不明白virual 和override ,C++应该virual就应该可以实现多态的情况,虽然调用的是父类,缺执行的是子类的代码。    有人能帮我分析,我上面的四个表达式是否正确,和virual 和override的作用么?特别是override么?
      

  7.   

    Class A
    {
    public abstract void method1();//存在抽象方法,ClassA不能直接实例化,抽象方法不需要函数体
    public virtual void method2(){}
    public void method3(){}//无修饰符
    }Class B:A
    {
    public override void method1(){};
    public override void method2(){};
    public new void method3(){};
    }B b = new Class B();
    A a = b;
    a.method1();//调用Class B的方法
    b.method1();//调用Class B的方法a.method2();//调用Class B的方法
    b.method2();//调用Class B的方法a.method3();//调用Class A的方法
    b.method3();//调用Class B的方法
      

  8.   


            public abstract class A
            {
                public abstract void method1();//存在抽象方法,Class A不能直接实例化,Class 必须定义为抽象类,抽象方法不需要定义函数体            public virtual void method2(){ }            public void method3(){ }
            }        public class B:A
            {
                public override void method1(){}
                public override void method2(){}
                public void method3(){}
            }        B b = new B();
            A a = b;        a.method1();//调用Class B的方法
            b.method1();//调用Class B的方法        a.method2();//调用Class B的方法
            b.method2();//调用Class B的方法        a.method3();//调用Class A的方法
            b.method3();//调用Class B的方法
      

  9.   

    如果实例化的是子类调用的是子类的方法,如果实例化的是父类调用的是父类的方法。如果A a=new B();则调用的是B类的方法。
      

  10.   

    大家说的我有点迷糊,我说说自己的看法吧:
      子类A 父类B
       
      A a = new B() 正确
      A a = new A() 正确
      B b = new B() 正确
      B b = new A() 不正确,即使加强制转换,也会出错。
    但是C#,我不明白virual 和override ,C++应该virual就应该可以实现多态的情况,虽然调用的是父类,缺执行的是子类的代码。  有人能帮我分析,我上面的四个表达式是否正确,和virual 和override的作用么?特别是override么?
      

  11.   

    自己顶下,首先谢谢上面的这些楼主,很辛苦,贴了很多的代码
      但是还没有使我弄明白。
      
        我只想知道 virual override 特别市override
      

  12.   


    我的理解是
    virual 显示说明这个类成员是虚方法,一般子类中可以重写他,不一定非要重写 
    override 重写类成员,原成员在基类中必须含有关键字 virual(虚) abstract(抽象)  override(被重写)
    这个修饰符是最常用的,无论引用类型是子类还是基类,都只调用子类方法,就是多态new 使用他重写的方法,会根据实际调用的类来调用方法,引用子类类型,则执行子类重写的方法,基类类型则调用未被重写的那个方法abstract 抽象方法,必须在子类中重写,也必须在抽象类中定义
    virual abstract override new 这些修饰符是互斥的,也有级别关系
    一般最原始的类成员才会出现 virual abstract  
    最终的实现方法一般是override new 重写 不能更改方法的可访问性,参数,返回类型