class A
    {
        public virtual void Method()
        {
            Console.WriteLine("My name is haha.");
        }        public A()
        {
            Method();
        }
    }    class B : A
    {
        public override void Method()
        {
            Console.WriteLine("My name is zhanghao.");
        }        public B()
        {
            Method();
        }
    }最终B b=new B();在控制台输出的是:
My name is zhanghao.
My name is zhanghao.
而我自己给出的答案却是:
My name is haha.
My name is zhanghao.
为什么实例化B类的时候调用父类的构造函数时调用的方法是已重写的呢

解决方案 »

  1.   

    我们知道,虚函数virtual 修饰的方法,里面是可以进行写语句体的,那里在它的子类里面的话,是可以去调用这个父类里面的这个虚函数的,也可以像你的实例当中一样,对它进行重写重写方法,那里当 我们在子类当中进行对父类的这个方法进行重写的时候,就会不在使用父类里面的那个方法体了,
    这个功能也就是我们所说的“多态”了,
    这也是与抽像方法的一个区别所在的。
    我们知道 抽像的方法它只是一个定义的,是不能有方法体的,而虚方法则不一定了,必须要有一个方法体的,那怕是一个分号也行的。
    虚方法与抽像的方法还有一个区别就是抽像的方法在子类当中一定要对它进行重写(override )的,而虚方法则是可以重写也可以不进行重写。
    不知我的说的是否明白了。
    所以我的答案是输出结果:
    My name is zhanghao.
    My name is zhanghao.有会问题可以进行沟通的。
      

  2.   

    应为类型的方法表是在构造函数中的代码执行前创建的简单的说就是在执行
           public A()
            {
                Method();
            }
    之前就已经确定调用的Method 是B的了