黑马程序员技术交流社区

标题: 一个关于多态的问题 [打印本页]

作者: 经睿    时间: 2011-12-20 12:14
标题: 一个关于多态的问题
本帖最后由 经睿 于 2011-12-20 17:21 编辑

当声明一个父类对象指向一个子类对象时,在该对象中调用一个父类和子类中都存在的方法,如果子类没有重写父类的这个方法,那么为什么会调用父类的这个方法而不是子类的
代码如下
  1.     class Program
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.             Animal a = new Animal();
  6.             a.Eat();

  7.             Animal ac = new Cat();
  8.             ac.Eat();

  9.             Cat c = new Cat();
  10.             c.Eat();

  11.             Console.ReadKey();
  12.         }
  13.     }
  14.     public class Animal
  15.     {
  16.         public virtual void Eat()
  17.         {
  18.             Console.WriteLine("Animal eat");
  19.         }
  20.     }

  21.     public class Cat : Animal
  22.     {
  23.         public new void Eat()
  24.         {
  25.             Console.WriteLine("Cat eat");
  26.         }
  27.     }
复制代码
运行结果为:

Animal eat
Animal eat
Cat eat

作者: 董志    时间: 2011-12-20 12:27
本帖最后由 董志 于 2011-12-20 12:29 编辑

没有重写的话,编译器会把cat蜕化成animal使用,不在具有猫独有的特点,仅是一个动物而已,虽然它确实是猫
如果父类中eat是虚的,子类重写了,则会根据具体对象调用。这个叫多态。
作者: 经睿    时间: 2011-12-20 12:37
想明白了挺简单的。ac对象既然被声明为Animal类型,和Cat类中定义的函数一毛钱的关系都没有。我基础太不扎实了,汗颜。{:soso_e127:}
作者: 董志    时间: 2011-12-20 12:48
也不是完全没有关系,如果是虚方法被重写了,那就有很大关系了,呵呵
作者: 经睿    时间: 2011-12-20 13:13
董志 发表于 2011-12-20 12:48
也不是完全没有关系,如果是虚方法被重写了,那就有很大关系了,呵呵

嗯,虚方法和抽象方法是特例,编译器在编译的时候肯定会做特殊处理的
作者: 李荣壮    时间: 2011-12-20 13:23
new是隐藏了父类(Animal)的Eat方法,所以Cat里面的Eat跟Animal中的Eat是没有关系的,当你把ac(Animal类)指向一个Cat对象的时候,自然而然的是调用Animal的Eat.
override是覆盖..就是重新把父类的方法实现
没事少用new,会破坏继承,会把人搞晕的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2