class A
    {
        public virtual void showinfo()//虚方法
        {
            Console.WriteLine("A1");
        
        }
        public void show()
        {
            Console.WriteLine("A2");
        
        }    }
    class B : A
    {        public override void showinfo()//重新重载虚方法
        {
            Console.WriteLine("B1");
        }        public  new void show()
        {            Console.WriteLine("B2");
        }
    
    }上面的是声明的两个类
为什么在
Main中
要这样实现才可以看到虚方法的特性呢              B b = new B();
            A a = b;///这一句是我不懂的,为什么会这样? 请高手 大虾们解释一下 谢谢!!
            a.showinfo();
            b.showinfo();
            a.show();
            b.show();

解决方案 »

  1.   

    A a = b;
    定义了一个变量a,它的类型是A,但是实际上在内存里保存的是一个B类型的对象b
    因为B是从A继承来的,所以这样做是可以的。对于编译时绑定的函数,会调用A里面定义的函数,因为对编译器来说它是A类型
    对于运行时绑定的函数,会调用B里面定义的函数,因为实际上它是一个B对象
      

  2.   

    Main 方法是程序的入口,只能有一个。在程序执行的时候最最先调用Main方法
      

  3.   

    Main方法是程序的入口点,程序控制在该方法中开始和结束。 
    该方法在类或结构的内部声明。它必须为静态方法,而不应为公共方法
    它可以具有 void 或 int 返回类型。 
    声明 Main 方法时既可以使用参数,也可以不使用参数。 
    定义一个A对象,指向b地址.
      

  4.   

    Main()方法是一个程序的入口点。没有入口点程序怎么启动??最简单的比喻就是一个生产产品的流水线,总会有一个开始的地方吧?
      

  5.   

    A a = b
    将对象B的实例赋给A对象的实例a,因为B从A继承而来,所以可以这样写。
    Main是程序的入口,程序的执行从这里开始!
      

  6.   

    Main 只是一个默认的入口点而已不写 Main 函数, 照样可以使用其他函数作为入口点;
    你可以写多个 Main() 函数, 指定使用哪个作为入口点.默认的, 假定的, 并不是必需的.
      

  7.   

    A a = b;///这一句是我不懂的,为什么会这样? 请高手 大虾们解释一下 谢谢!! 
    派生类的对象赋值给基类的指针,可以用基类的指针调用派生类中override的函数;
      

  8.   

    学校里老师讲虚方法时, 都是照本宣科, 没有讲出虚方法的由来,
    下面简单总结一下:假设A是父类, B是子类,
    如果使用时, 定义与实例时所用类相同, 即父类用父类实例化, 子类用子类实例化, 
    如A a = new A;
    B b = new B;
    虚方法是一点用处也没有, 只有当定义用父类, 实例化时用子类, 虚方法才有作用
    即A a = new B;(还有一种情况就是定义用子类, 实例化用父类,即B b = new A; 这是错误的, 平时根本不可能用)这就是为什么楼主所举例子里, 一定要用A a = b;
    不仅这个例子如此, 所有讲虚方法的例子里都是这样--定义用父类, 实例化用子类,只有在这种情况下, 虚方法才有意义, 其它任何情况, 虚方法都用不上
      

  9.   

    结果为:
    B1
    B1
    A2
    B2
    A a = b;///这一句是
    这样理解
    B b=new B();
    A a = b//A的对象a指向b实例调用的时候就是B的方法
      

  10.   

    程序结果为
    B1
    B1
    A2
    B2
     B b = new B(); //创建一个B类的对象
    A a = b;//隐式转换,当在用到父类的时候用子类代替可以,当要用到子类的时候用父类代替则不行。当想把父类转成子类时,必须要显示转换.
    a.showinfo(); //由于子类是重写父类方法,所以它以后调用的就是重写后的方法
    b.showinfo(); 
    a.show(); 
    b.show();这个例子主要功能之一就是可以反映出new关键字,和使用virtual和override的组合之间的区别。
    如果子类从写了父类的方法,以后就算子类转换成父类了,但是它所执行的永远是重写后的方法。
    而使用new关键字,只是覆盖原方法。此时如果把子类转换成父类,那么父类执行的就是自己的方法了。
    而不是子类用来覆盖父类的方法。慢慢体会。
      

  11.   

    Main方法是应用程序的入口,程序必须顺序执行Main方法中的语句来运行程序。