class Program
    {
        static void Main(string[] args)
        {
            Dog dog = new Dog() ;
            Console.WriteLine(dog.Name);      //Animal     
            
        }      
    }
    class Animal
    {
        public Animal()
        {
            Name = "Animal";
        }
        virtual public string Name
        {
            set;
            get;
        }   
    }
    class Dog : Animal
    {
        public Dog()
        {
        }
        public override string Name
        {
            set;
            get;
        }
    }派生类中的Name属性为什么没有override基类中的Name属性,结果应该是空。我知道执行构造函数时,先执行Animal(),再执行Dog(),是不是Animal的构造函数中给Name赋值,也同时会给Dog的Name属性赋值?

解决方案 »

  1.   

    用了virtual后,基类的成员就是虚的,像一个影子。所以一共只有一个Name,哪里来的Dog的Name和Animal的Name。
      

  2.   

    因为你使用了override关键字,子类将会覆盖基类的属性。子类调用基类的构造函数,你可以认为是子类复用了基类的构造函数,因此在基类的构造函数中对Name的赋值,实际上是对Dog类的Name属性的赋值。如果要实现你说的Name属性值为空,你可以使用new关键字来替代override关键字。这时候就相当于Dog类有自己的属性Name,而它的基类也有独立的同名属性。
      

  3.   

    对象内存分配不了解,很多问题就无法理解。
    new Dog() 的时候,把实例 字段成员写出来,就知道了。还有方法表是什么样子的,对继承就会有很好的理解。