3.指向孙类对象
  现在我再添加一个Student的子类James,从上一个例子中已经知道只有override关键字重写的方法父类才会调用,因此我将普通方法全部删除。执行代码为Person p = new James() { name = "James", studentId = 2, Id = 4 };代码和内存分配图如下,为了突出重点,图中我没有画字段了。从结果可以看到SayHi方法后是被孙类的SayHi覆盖了,从这里可以看出继承的传递性!
  public  abstract class Person
  {
  public  int Id;
  public virtual void Eat()
  {
  Console.WriteLine( "在吃梨");
  }
  public virtual void Walk()
  {
  Console.WriteLine("在散步");
  }
  //抽象方法只能在抽象类中声明,因此要在Person前加abstract,且只能声明并必须在子类中实现。
  public abstract void Run();
  public virtual void SayHi()
  {
  Console.WriteLine("人说:你好!");
  }
  }
  public class Student:Person
  {
  public int studentId;
  public virtual void Eat()
  {
  Console.WriteLine("学生  在吃梨");
  }
  public override void Walk()
  {
  Console.WriteLine("学生  在散步");
  }
  public override void Run()
  {
  Console.WriteLine("学生  在跑步");
  }
  }
  public class James:Student
  {
  public string name;
  public override void Eat()
  {
  Console.WriteLine("James  在吃梨");
  }
  public override void Walk()
  {
  Console.WriteLine("James  在散步");
  }
  public override void Run()
  {
  Console.WriteLine("James  在跑步");
  }
  public override  void SayHi()
  {
  Console.WriteLine("James说:你好!");
  }
  }