public class A
    {
        public A()
        {
            Console.WriteLine('A');
        }
        public virtual void Fun()
        {
            Console.WriteLine("A.Fun()");
        }
    }
    public class B : A
    {
        public B()
        {
            Console.WriteLine('B');
        }
        public new void Fun()
        {
            Console.WriteLine("B.Fun()");
        }
        public static void Main()
        {
            
            A a = new B();//这句话什么意思
            a.Fun();
        }
    }  public class A
    {
        public A()
        {
            Console.WriteLine('A');
        }
        public virtual void Fun()
        {
            Console.WriteLine("A.Fun()");
        }
    }
    public class B : A
    {
        public B()
        {
            Console.WriteLine('B');
        }
        public new void Fun()
        {
            Console.WriteLine("B.Fun()");
        }
        public static void Main()
        {
            
            A a = new B();//这句话什么意思
            a.Fun();
        }
    }

解决方案 »

  1.   

      public class A
        {
            public A()
            {
                Console.WriteLine('A');
            }
            public virtual void Fun()
            {
                Console.WriteLine("A.Fun()");
            }
        }
        public class B : A
        {
            public B()
            {
                Console.WriteLine('B');
            }
            public new void Fun()
            {
                Console.WriteLine("B.Fun()");
            }
            public static void Main()
            {
                
                A a = new B();//这句话什么意思
                a.Fun();
            }
        }
      

  2.   

    A a = new B();//这句话什么意思
    A是B的父类。
    声明一个父类的引用,分配创建一个子类对象。使用父类的引用指向子类的对象。这样好理解点动物 obj = new 人();
      

  3.   

     A a = new B();//这句话什么意思
    因为B继承了A,这句话的意思是声明一个基类A,但是把它实例化为B,那么这个a对象是B类的一个实例,只能实现B从A类中继承的方法。即只能实现基类A中的方法,所以那个a.Fun();输出的是
    Console.WriteLine("A.Fun()");而
      

  4.   


    可以这样理解吗?new B()//初始化B,执行B的构造函数
    由于B继承A,先回执行A  的构造函数然后把初始化的对象B指向A a的引用
      

  5.   


    这样说
    也就是
    new B()-->初始化对象,执行构造函数-->一块内存
    A a-->就是一个引用,
    a=new B()-->这个引用a,指向这块内存new B()
      

  6.   

    多态,查看下http://www.cnblogs.com/luminji/archive/2010/09/06/1819371.html
      

  7.   

    谢谢
    还有个地方
    请教下 a.Fun()-->运行之后的结果
    为什么是A.Fun()
    而不是B.Fun()
      

  8.   

    因为
    public new void Fun()
    这里你并没有重载,而是编写了一个同名的方法覆盖了基类方法。
      

  9.   

    也就是说
     A a = new B();
    此时a是指向new B()的
    但是又继承A
    所有B也可以调用这个方法
            public virtual void Fun()
            {
                Console.WriteLine("A.Fun()");
            }
    而class B里面用了
     public new void Fun()
    来覆盖基类的方法如果改为
     public new void Fun()--> public override void Fun()
    a.fun()的结果就是B.Fun()这样理解对吗?
      

  10.   

    virtual的虚方法是和实例化的对象相关的,new覆盖了函数签名,你在B外无法使用到虚方法的fun了。B内部可以。换成overrides是调用B的方法。调用哪一个其实非常容易理解,虚函数(方法)跟对象相关,非虚函数跟指向对象的引用类型相关。
    你12#描述的也对。