namespace 继承
{
    
    class A
    {
        public A()
        {
           
PrintFields();  
        }
        public virtual void PrintFields() { }
    }
    class B : A
    {
        int x = 1;
        int y;           
        public B()    
        {
            y = -1;
            Console.WriteLine("x={0},y={1}", x, y);
        }
        public override void PrintFields()  //步骤3 :  运行这个方法
        {
            Console.WriteLine("x={0},y={1}", x, y);
        }
}
class Program
    {
        static void Main(string[] args)
        {
            B b = new B();
      
        }
    }
}上述程序在运行的时候,发现是先运行A的构造函数,然后A的构造函数中调用PrintFields虚函数,最后调用了B类中的PrintFields函数。可如果将main函数中的语句改为 A a=new A(),执行的指示A的虚函数PrintFields,而不是B中的PrintFields方法。我知道,
当调用一个对象的虚函数时,系统会直接去检查这个对象的实例是哪个类型,然后在这个类中找到虚函数的override方法。但是上述过程中,A的构造函数调用的时候,到底是哪个对象的实例在调用虚函数PrintFields呢!

解决方案 »

  1.   

    http://www.cnblogs.com/jiajiayuan/archive/2011/09/14/2176015.html
      

  2.   

    永远不要在构造函数中调用虚函数,无论什么语言,也无论编译器是否支持这样做。这句话来自:Effective C++ (3rd Edition) Item 9: Never call virtual functions during construction or destruction.很多人不是最喜欢让别人推荐名著么?